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 есть несколько исключений в шаблонах, что я сначала и назвал причиной. Но определение «базовой» функции внутри / вне класса имеет значение здесь.

Ответы на вопрос(1)

Ваш ответ на вопрос