One Definition Rule指出程序应该包含每个非内联函数的一个定义。对于模板类的成员,这并不完全清楚对我说:类方法的显式特殊化 - 已定义的符号
///////////
// Tfoo.h
template<typename T> class A {
void foo(){}
};
///////////
// intfoo.h
#include <Tfoo.h>
template<> class Foo<int> {
void foo(); // declaration only
};
/*inline*/ void Foo<int>::foo(){} // definition
///////////
// X.cpp
#include <intfoo.h>
///////////
// Y.cpp
#include <intfoo.h>
在这种情况下,无论是clientX.obj和clientY.obj有Foo<int>::foo
的定义。链接器抱怨说,这个符号定义不止一次:
Y.obj : error LNK2005: "private: void __thiscall Foo<int>::foo(void)"
([email protected][email protected]@@AAEXXZ) already defined in X.obj
当我在前面加上inline
到Foo<int>::foo()
定义,一切顺利和链接是幸福的。另外当我在一个单独的编译单元中定义它们的方法(例如intfoo.cpp)。
(注:这个解决方案是在https://stackoverflow.com/a/1481796/6610建议)
可能是一个误解,但不是模板类总是“内联”的成员函数?这里的规则是什么?
什么[这里](http://stackoverflow.com/questions/3694899/c-template-and-inline)? – 2013-04-23 08:31:33