2015-10-16 2 views
0

При компиляции моей программы я получаю сообщение об ошибке 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 в каталог исходных файлов/

+2

[Почему шаблоны могут быть только в заголовке] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) –

+2

Декларация класса и сглаживание в случае шаблона должен быть в одном файле. – Mykola

+0

Отлично, у меня был небольшой кризис, когда это не сработало. C++ - это, безусловно, немного минной тонкости и подводных камней. – Anandamide

ответ

0

Компилятор расширяет шаблонные типы (и функции) в той точке, в которой они используются. Это означает, что компилятор должен иметь возможность найти их определение в той точке, в которой они используются. По этой причине все определения шаблонов (а не только декларации) должны существовать в заголовке или файле, включенном в заголовок.