在 「未定義的引用」 這些都是我的文件:模板函數被報道編譯
-------- [c.hpp] --------
#ifndef _C
#define _C
#include<iostream>
class C
{
public:
template<class CARTYPE> void call(CARTYPE& c);
};
#endif
-------- [c.cpp] --------
#include "c.hpp"
template<class CARTYPE> void C::call(CARTYPE& c)
{
//make use of c somewhere here
std::cout<<"Car"<<std::endl;
}
-------- [v.cpp] --------
class Merc
{};
-------- [main.cpp中] --------
#include "c.hpp"
#include "v.cpp"
//#include "c.cpp"
int main()
{
Merc m;
C someCar;
someCar.call(m);
}//main
我能夠爲所有上述文件名爲 「.o」 文件,用命令g ++ -c main.cpp和g ++ -c c.cpp等等。 但是當我嘗試連接使用g ++ -o汽車合作main.o沃 的名爲「.o」文件,我得到這個錯誤:
main.o: In function `main':
main.cpp:(.text+0x17): undefined reference to `void C::call<Merc>(Merc&)'
collect2: ld returned 1 exit status
錯誤消失,當我取消對該行的#include「c.cpp 「在main.cpp中,但我覺得用這種方式包含cpp文件可能是不好的做法。我做錯了嗎?在創建單獨的對象文件並鏈接它們時,是否有更好的方法來迎合模板聲明? p.s:我在更復雜的類結構中使用模板函數。這裏展示的僅僅是一個小例子,目的是向你展示我面臨的錯誤。
請參閱http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file – 2010-10-07 05:18:38
@Pavel:您指出的解決方案是我需要的確切解決方案。謝謝:) – Nav 2010-10-07 06:15:14