2010-09-22 68 views
1

我在使用C++中的模板進行編程時遇到了困難。C++中的模板編程

請考慮以下文件。

C.h

#ifndef _C_H 
#define _C_H 

template <class T> 
class C { 
public: 
    C(); 
    virtual ~C(); 
} 
#endif _C_H 

C.cpp

#include "C.h" 

template <class T> 
C<T>::C() { 

} 

template <class T> 
C<T>::~C() { 
} 

我嘗試在一個名爲main.cpp中實例化一個C的實例。

#include "C.h" 

int main(int argc, char** argv) { 
    C<int> c; 
} 

我收到以下錯誤消息。

main.cpp undefined reference to `C<int>::C()' 

我然後運行

g++ -o C.o C.pp 
g++ -o main.o main.cpp 

,但得到的錯誤

main.cpp: undefined reference to `C<int>::C()' 
main.cpp: undefined reference to `C<int>::~C()' 

我相信這可能是一個明顯的錯誤,但我在這個真正的初學者所以希望得到任何幫助。

謝謝!

+0

強制鏈接:[C++ FAQ](http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12)。 – 2010-09-22 00:55:58

+0

感謝您的鏈接,格奧爾格。 – bandini 2010-09-22 01:29:06

+0

'_C_H'是[保留](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier)。 – GManNickG 2010-09-22 08:16:10

回答

5

使用模板時,只要實例化類型,源代碼就需要可用,否則編譯器無法檢查模板代碼是否適用於給定類型。將它分割成.cpp和.h文件將不起作用,因爲其他.cpp文件只知道.h文件。

基本上你必須把所有東西放在.h文件中,或者在你的實現代碼中包含一個額外的文件。

+0

非常感謝。源於嘗試從java的背景中學習C++的誤解。 – bandini 2010-09-22 01:04:09

+0

+1:還有其他方法,但對於初學者來說,這已經足夠了。 – 2010-09-22 02:53:18