2011-08-23 64 views
1

我的模板化函數有兩個模板參數(int mint n)。該函數返回一個類Foo<int r>,我想要r=m+n相關模板參數

foo.h中,我有:

template<int m> class Foo {}; 
template<int m, int n> 
Foo<m+n> myFunc(const Foo<m> &a, const Foo<n> &b); 

在Foo.cpp中我有:

Foo<m+n> myFunc(const Foo<m> &a, const Foo<n> &b) 
{ 
    return Foo<m+n>(); 
} 

最後,在main.cpp中:

#include "foo.h" 
int main() 
{ 
    myFunc(Foo<2>(), Foo<3>()); 
} 

如果我試試這個,我收到一個鏈接錯誤。:

"undefined reference to `Foo<(2)+(2)> myFunc(Foo<2> const&, Foo<2> const&)' 

編輯:編輯包括完整的代碼。也許不太清楚,但有些人更喜歡。

回答

3

您可能將功能體代碼放在錯誤的地方。使用(非專用)模板函數時,通常希望將整個函數體放在頭文件而不是源文件中,否則編譯器在調用該函數時無法生成該函數的代碼。

+0

咄,僅此而已。乾杯! – Unapiedra

+0

否則它會在更新智能感知(49)....(48)....時導致VC無法停止.... – John

3

從你提供的很少,這個錯誤表明,儘管你已經聲明瞭這個函數,但是你並沒有在鏈接器可以看到的任何地方提供實現。

0

這是因爲您沒有定義函數或定義在實例化時對編譯器不可見。如果你寫一個函數體,它的工作原理:

template <int> class Foo {}; 

template<int m, int n> 
Foo<m+n> myFunc(const Foo<m> &a, const Foo<n> &b) {} // NOTE: Body. 

int main() { 
    myFunc (Foo<1>(), Foo<2>()); 
} 

(旁註:後完整的代碼接下來的時間,請)