2015-06-17 7 views
11

Betrachten Sie den Code unten:Linker-Fehler mit variabler Vorlagen

#include <iostream> 

template<typename T> 
T n; 

int main() 
{ 
    n<int> = 42; 
    std::cout << n<int> << std::endl; 
} 

Es compiles and links with g++5.1, und es zeigt 42. Allerdings Klirren ++ fails to link it:

undefined reference to n <int>

Wenn ich initialisieren die Template-Variable wie

template<typename T> T n{}; 

dann clang++ links it too.

Irgendeine Idee was ist los? Ist "C++" korrekt, wenn das Programm nicht verlinkt wird? Und warum funktioniert es, wenn ich die Template-Variable initialisiere?

Soweit ich weiß, Template-Variablen sind nur syntaktische Zucker für Vorlagen-Wrapper um statische Mitglieder, so ist effektiv spezialisiert auf die int Instanz. IMO sollte der Code verlinken.

+7

Sieht aus wie https://llvm.org/bugs/show_bug.cgi?id=22825 – dyp

+0

@dyp Ich stimme zu, das sieht nach dem Problem aus. – JKor

+2

Das ist in der Tat. @dyp posten eine _answer_ kein Kommentar !! –

Antwort

6

Dies ist ein Fehler in clang ++ #22825. Der Fehlerbericht wurde am 2015-03-06 eingereicht und der Fehler wurde noch nicht behoben. Richard Smith vermutet, dass diese Definition fälschlicherweise nur als Vorwärtsdeklaration behandelt wird.

+0

Entschuldigung, aber ich habe keine weiteren Informationen zu diesem Fehler. Ich könnte später etwas Zeit haben, um in die klingenden Quellen zu schauen. – dyp