C++ Неразрешенный внешний символ с шаблонами классов

Вот простой пример использования шаблонов классов в C++. Этот код работает.

#include <iostream>

using namespace std;

template <class T>
class Test {
public:
   Test();
   void print();
private:
    int i;
};

template <class T>
Test<T>::Test() {
    i=1;
    cout<<"New instance"<<endl;
}

template <class T>
void Test<T>::print() {
    cout<<"Test"<<endl;
}

int main() {
    Test<int> i;
    i.print();
    return 0;
}

Поэтому, когда я разделяю этот код на 3 файла: main.cpp, Test.h, Test.cpp:

//Test.h
#include <iostream>

using namespace std;

template <class T>
class Test {
public:
   Test();
   void print();
private:
    int i;
};

//Test.cpp
#include "Test.h"

template <class T>
Test<T>::Test() {
    i=1;
    cout<<"New instance"<<endl;
}

template <class T>
void Test<T>::print() {
    cout<<"Test"<<endl;
}

//main.cpp
#include "Test.h"

using namespace std;

int main() {
    Test<int> i;
    i.print();
    return 0;
}

Я получаю ошибки:

1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall Test<int>::print(void)" (?print@?$Test@H@@QAEXXZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Test<int>::Test<int>(void)" (??0?$Test@H@@QAE@XZ) referenced in function _mai
1>C:\Programming\C++\stuff\templass\Debug\templass.exe : fatal error LNK1120: 2 unresolved externals

Я использую Microsoft Visual C++ 2010 Express. Поэтому я много искал о неразрешенном внешнем символе, но больше не нашел для этого случая. Так в чём моя ошибка?

1 ответ

Решение

Шаблоны не могут быть скомпилированы как любой другой исходный файл. И интерфейс, и реализация должны жить в заголовочном файле (хотя некоторые разделяют их в .hpp файлы для интерфейса и .ipp файлы для реализации, а затем включить .ipp файл в конце .hpp файл).

Как бы компилятор узнал, какие классы генерировать, когда класс шаблона компилируется?

Другие вопросы по тегам