我已经定义了一个带有一个成员函数的简单类模板。它是在类外定义的,具有额外的(显式)特化,也在类外定义。全部在一个头文件中。如果您在多个翻译单元中包含此标头,则会由于 One-Definition-Rule 导致链接器错误。
// Header with a template
template <class T>
class TestClass
{
public:
TestClass() {};
~TestClass() {};
bool MemberFunction();
};
template <class T>
bool TestClass<T>::MemberFunction()
{
return true;
}
template <>
bool TestClass<double>::MemberFunction()
{
return true;
};
到目前为止一切都很好。但是如果我将成员函数的定义放在类体内,链接器错误就会消失,并且这些函数可以在不同的翻译单元中使用。
// Header with a template
template <class T>
class TestClass
{
public:
TestClass() {};
~TestClass() {};
bool MemberFunction()
{
return true;
}
};
template <>
bool TestClass<double>::MemberFunction()
{
return true;
};
我的问题是为什么它会这样工作?我使用 MSVC 2012。ODR 在模板上有一些例外,我最初认为这是原因。但是类内部/外部的“Base”函数的定义在这里有所不同。