C ++: definir la función miembro fuera de la clase de plantilla pero en el encabezado

He definido una plantilla de clase simple con una función miembro. Se define fuera de la clase con una especialización adicional (explícita), también definida fuera de la clase. Todo en un archivo de encabezado. Si incluye este encabezado en varias unidades de traducción, obtendrá un error de vinculador debido a la regla de una definición.

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

Todo bien hasta ahora. Pero si pongo la definición de la función miembro dentro del cuerpo de la clase, el error del vinculador desaparece y las funciones se pueden usar en diferentes unidades de traducción.

// Header with a template

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

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

Mi pregunta es ¿por qué funciona de esa manera? Uso MSVC 2012. ODR tiene algunas excepciones en las plantillas, lo que primero pensé que era la razón. Pero la definición de la función "Base" dentro / fuera de la clase hace la diferencia aquí.

Respuestas a la pregunta(1)

Su respuesta a la pregunta