2012-10-23 92 views
2

我無法使用Comeau和G ++編譯器在C++中編譯小代碼。我認爲我的代碼存在問題。那就是:G ++:從模板調用函數:undefined symbol

template < typename T > void f(T t) { g(t); } 
void g(int){} 
int main() { 
    int a = 0; 
    f(a); 
    return 0; 
} 

功能g()這裏不是由編譯器發現。 但是,如果使用一個用戶定義類型(不int),它被編譯OK:

template < typename T > void f(T t) { g(t); } 
struct A {}; 
void g(A a) {} 
int main() { 
    A a; 
    f(a); 
    return 0; 
} 

誰能幫我編譯這段代碼INT(雙,字符等)?

+0

在第一個代碼片段中,您的模板函數「f」預計可以是任何類型的參數。這種類型被標記爲「T」。但是,在該函數內部,您將一個類型爲「T」的值傳遞給僅接受整數的函數。如果'T'不是整數類型?你怎麼可以解釋這一點? 我懷疑第二個代碼片段編譯並運行;但是,這並沒有改變問題的根源。 爲了讓'f'對所有類型都可用,你必須讓'g'適用於所有類型,或者使它獨立於'T'類型。 –

回答

0

也許不相關,但在VC++ 2012中,這給出int a行中的未初始化的變量警告。第二個例子(而不是由於缺少大括號void g(A a)而編譯)創建一個具有默認構造函數的結構,所以不會發生錯誤。嘗試在頂部代碼中初始化您的int變量,並查看錯誤是否仍然存在。

+0

感謝您的評論。我添加了大括號,當然,這是一個誤印。 – user1768878

+0

哦,未初始化的變量只是一個警告,並且對被描述的錯誤沒有影響。 – user1768878

+0

看起來好像您已經在編譯器中發現了一個錯誤,而不是您的代碼中。在MingW下用GCC 4.6.2測試得很好 –