Definir função de membro fora da classe de modelo, mas no cabeçalho

Eu defini um modelo de classe simples com uma função de membro. É definido fora da classe com uma especialização adicional (explícita), também definida fora da classe. Tudo em um arquivo de cabeçalho. Se você incluir esse cabeçalho em várias unidades de conversão, receberá um erro no vinculador devido à regra de definição única.

// 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;
};

Tudo bem até agora. Mas se eu colocar a definição da função de membro dentro do corpo da classe, o erro do vinculador desaparece e as funções podem ser usadas em diferentes unidades de tradução.

// Header with a template

template <class T>
class TestClass
{
public:
    TestClass() {};
    ~TestClass() {};
    bool MemberFunction()
    {
        return true;
    }
};

template <>
bool TestClass<double>::MemberFunction()
{
    return true;
};

Minha pergunta é por que funciona dessa maneira? Eu uso o MSVC 2012. ODR tem algumas exceções em modelos, o que eu pensava ser o primeiro motivo. Mas a definição da função "Base" dentro / fora da classe faz a diferença aqui.

questionAnswers(1)

yourAnswerToTheQuestion