C ++ - Member-Funktion außerhalb der Template-Klasse, aber im Header definieren

Ich habe eine einfache Klassenvorlage mit einer Mitgliedsfunktion definiert. Es wird außerhalb der Klasse mit einer zusätzlichen (expliziten) Spezialisierung definiert, die auch außerhalb der Klasse definiert wird. Alles in einer Headerdatei. Wenn Sie diesen Header in mehrere Übersetzungseinheiten aufnehmen, wird aufgrund der One-Definition-Rule ein Linker-Fehler angezeigt.

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

lles in Ordnung so weit. Wenn ich jedoch die Definition der Member-Funktion in den Klassenhauptteil einfüge, verschwindet der Linker-Fehler und die Funktionen können in verschiedenen Übersetzungseinheiten verwendet werden.

// Header with a template

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

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

Meine Frage ist, warum es so funktioniert? Ich benutze MSVC 2012. ODR hat einige Ausnahmen bei Vorlagen, was ich zuerst für den Grund gehalten habe. Aber die Definition der "Base" -Funktion innerhalb / außerhalb der Klasse macht hier den Unterschied.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage