При компиляции моей программы я получаю сообщение об ошибке LINK2019. Общей ошибкой является то, что функция была объявлена, но не определена, что здесь не так. Например, я класс ниже, который определен в заголовочном файле dict.hНеразрешенный внешний символ. Сообщество MSVS 2015
template<typename key, typename elem>
class Slist{
public:
list<KV_pair<key, elem>> *data;
Slist(int size);
~Slist();
void insert(KV_pair<key, elem> &kv);
elem &operator[](key k_val);
};
И я определил членов, как это в отдельном файле dict.cpp
template<typename key, typename elem>
Slist<key, elem>::Slist(int size) {
data = new list<KV_pair<key, elem>>(size);
}
template<typename key, typename elem>
Slist<key, elem>::~Slist() {
}
template<typename key, typename elem>
void Slist<key, elem>::insert(KV_pair<key, elem> &kv){
KV_pair<key, elem> *temp;
for (data->movestart();data->r_len() > 0; data->next()) {
temp = &data->get_val();
if (temp->get_key() > kv.get_key()) {
break;
}
data->insert(kv);
}
}
Если я ставлю мой main()
в файле dict.cpp все работает, но когда я пытаюсь поместить main()
в отдельный файл и #include "dict.h"
, я получаю нерешенную ошибку externals. Хотя это неправильно, использование #include "dict.cpp"
после #include "dict.h"
устраняет эту ошибку. У меня есть файл dict.h в каталоге файлов заголовков, и поместите оба файла main.cpp и dict.cpp в каталог исходных файлов/
[Почему шаблоны могут быть только в заголовке] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) –
Декларация класса и сглаживание в случае шаблона должен быть в одном файле. – Mykola
Отлично, у меня был небольшой кризис, когда это не сработало. C++ - это, безусловно, немного минной тонкости и подводных камней. – Anandamide