C++模板声明和定义为什么必须放在一起
C++的模板定义和声明必须放在一个文件中,如果我把声明放在一个.h文件中,定义放在另一个.cpp中,便无法通过编译。比如VS2008.
这是为什么呢?
Agent47
11 years, 8 months ago
Answers
模板类似宏的实现,在代码编译的时候,遇到模板申明就生成对应的模板类和方法(新的一个类),如果申明和定义是分开的,在编译的时候是对的,因为找到了相应的定义,但在链接的时候cpp和.h文件是分开的生成的函数式不同的,所以会链接错误。
ex:
Foo.h
Foo.cpp
template<typename T>
Foo<T>::Foo()
{
...
}
template<typename T>
void Foo<T>::DoSomeThing(T x)
{
...
}
my.cpp
编译my.cpp 的时候去匹配Foo.h 只生成了Foo<int>::DoSomeThing()的申明。在编译Foo.cpp的时候才能匹配到DoSomeThing的真正定义。所以任何时候,定义声明都没遇到一起。因此在链接的时候就找不到此函数的定义了。。。
xchuner
answered 11 years, 8 months ago