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