2013-12-02 3 views
-4

Вот простой пример использования шаблонов классов в 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)" ([email protected][email protected]@@QAEXXZ) referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Test<int>::Test<int>(void)" ([email protected]@@[email protected]) referenced in function _mai 
1>C:\Programming\C++\stuff\templass\Debug\templass.exe : fatal error LNK1120: 2 unresolved externals 

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

+0

«Итак, я много искал неразрешенный внешний символ, но больше не нашел для этого случая». В самом деле? Простой поиск Google для «неразрешенного внешнего символа шаблона» дает точное решение. –

ответ

1

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

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

Смежные вопросы