C ++ - определение функции-члена вне шаблона-класса, но в заголовке
Я определил простой шаблон класса с одной функцией-членом. Он определен вне класса с дополнительной (явной) специализацией, также определенной вне класса. Все в одном заголовочном файле. Если вы включите этот заголовок в несколько единиц перевода, вы получите ошибку компоновщика из-за 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 есть несколько исключений в шаблонах, что я сначала и назвал причиной. Но определение «базовой» функции внутри / вне класса имеет значение здесь.