2009-10-14 53 views
0

SO上遇到這兩個鏈接器錯誤後,我再次遇到這些問題。但是,這次來源似乎在另一個點上。帶模板功能的LNK2019和LNK1120

編譯器錯誤顯示它找不到具有簽名""public: unsigned int __thiscall MyClass::myFunction<unsigned int>(int)const "的功能。

但是,將myClass.cpp的內容移動到main.cpp的作品。不知道爲什麼(的myClass.cpp所有其他內容不存在這個問題。(其它功能都沒有模板)。

myClass.h

#ifndef X 
#define X 
class MyClass { 
public: 
    template<class T> 
    T myFunction (int someArgument) const; 
}; 
#endif 

myClass.cpp

#include "myClass.h" 
template<class T> 
T MyClass::myFunction (int someArgument) const { 
    return T(); 
} 

main.cpp

#include "myClass.h" 
int main() { 
    MyClass a(); 
    a.myFunction<unsigned int>(42); 
    return 0; 
} 

我該怎麼做fi x這個問題?

回答

5

因爲在main.cpp中,編譯器可以找到模板函數的定義。

模板無法編譯,編譯器需要能夠看到文件的定義,並且它無法在文件中看到。

要麼在myClass.h中包含myClass.cpp,要麼只是定義標題中的所有內容。

2

功能模板必須在頭文件中定義。類方法的模板不是該規則的例外。將方法的定義從'MyClass.cpp'移動到頭文件'MyClass.h'中。

myClass.h 

#ifndef X 
#define X 

class MyClass { 
public: 
    template<class T> 
    T myFunction (int someArgument) const; 
}; 

template<class T> 
T MyClass::myFunction (int someArgument) const { 
    return T(); 
} 

#endif 

不需要在「MyClass的」的全部,直到第一個非模板成員你「MyClass.cpp」。