2013-02-14 230 views
-2
main.o: In function `main': 
main.cpp:(.text+0x2f): undefined reference to `Foo<int>::display(int)' 
collect2: ld returned 1 exit status 

引起未定義參考

g++ -c *.cpp && g++ *.o -o foo 

foo.hpp

#ifndef FOO_H_ 
#define FOO_H_ 

template<typename T> 
class Foo { 
    private: 
    T ft_; 
    public: 
    Foo(const T & ft) : ft_(ft) { } 
    Foo display(T x); 
}; 

#endif 

foo.cpp

#include "foo.hpp" 
#include<iostream> 
using namespace std; 

template<typename T> 
Foo<T> Foo<T>::display(T x) { 
    // do some stuff - not too relevant 
    cout << "[" << x << "]"; 
    Foo<T> res(x); 
    return res; 
} 

main.cpp

#include<iostream> 
#include "foo.hpp" 
using namespace std; 

int main() { 
    Foo<int> f(42); 
    Foo<int> g = f.display(39); 
    return 0; 
} 

爲什麼?

P. S.與內聯函數定義一起使用。每當函數的聲明和定義被分成兩個文件時就會出現問題...

+1

Yaaaaaawwwwwwwwn – 2013-02-14 14:07:26

+2

你忘了在你的C++書中讀過那個告訴你不要在'.cpp'文件中定義函數模板的頁面。 – 2013-02-14 14:08:11

+0

http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file – 2013-02-14 14:10:49

回答

2

在C++中,您需要將模板化方法和函數的定義放入頭文件中。

+1

那麼在C++ 11中呢? – 2013-02-14 14:10:05

+0

@LightnessRacesinOrbit嗯看起來我一直對extern模板的含義感到困惑......我認爲有人提議可以在'.cpp'文件中定義模板並認爲它已進入。從答案中刪除該模板。 – 2013-02-14 14:17:33

+0

也許你正在考慮'export',它實際上是從C++ 11中刪除的,但從來沒有工作過。 – 2013-02-14 14:18:46