Explizite Schablonendeklaration / Definition in VS 2012

8

Der folgende Code deklariert eine Vorlage, deklariert eine explizite Instanziierungsdefinition und deklariert dann eine explizite Instanziierungsdeklaration:

%Vor%

gibt einen Fehler:

%Vor%

in Visual Studio 2012.

Ich bin unter dem Eindruck von Ссылка Dies sollte gültig sein, da die Definition der Deklaration folgt.

Vermisse ich etwas?

    
Jeff Gates 28.05.2013, 17:22
quelle

3 Antworten

7

Ihr Programm ist wohlgeformt. Paragraph 14.7.2 / 11 des C ++ 11 Standards spezifiziert:

  

Wenn eine Entität Gegenstand einer expliziten Instantiierungsdeklaration und einer expliziten Instanziierungsdefinition ist   In derselben Übersetzungseinheit muss die Definition der Erklärung folgen. [...]

Ihr Programm respektiert diese Einschränkung und bricht keine andere Regel. Daher ist dies ein Fehler in VC11.

    
Andy Prowl 28.05.2013, 17:26
quelle
2

Dieses Problem wurde anscheinend an Microsoft Connect 620017 gemeldet >:

  

Gepostet von Microsoft am 03.12.2010 um 13:52 Uhr

     
    

Hallo,

         

Wie Sie bereits bemerkt haben, ist unsere Implementierung von externen Vorlagen nicht möglich     entsprechen dem C ++ - 0x-Standard. Wir haben immer noch unsere alte Erweiterung     Implementierung. Obwohl wir nicht über die Ressourcen verfügen, um die     C ++ - 0x Version dieser Funktion für die nächste Version von Visual Studio,     Konformitätsprobleme haben für uns Priorität; Wir beabsichtigen dies derzeit     Implementieren Sie dieses Feature in einer zukünftigen Version von Visual Studio.

         

Danke, dass Sie sich die Zeit genommen haben, dieses Problem zu melden. Wir schätzen es.

         

Jamie Eckman visuelles C ++ Team

  

Das war von 2010, also meinte er bei "next release" VS2012.

    
user2497061 18.06.2013 12:02
quelle
2

Dieser Visual C ++ - Konformitätsfehler wird in Visual Studio 2013 behoben, das hier verfügbar ist. Mit diesem Fix können extern template -Deklarationen in Header-Dateien platziert werden, um die Template-Instanziierung zu unterdrücken und dennoch eine explizite Instanziierung in einem Modul zu deklarieren, wodurch die Kompilierungszeit und der Code-Bloat reduziert werden können. Das Umkehren der Anweisungen (dh eine explizite Instanziierungsanforderung, gefolgt von einer extern template -Deklaration mit denselben Vorlagenargumenten) verursacht weiterhin den Fehler C2929, da es so aussieht, als ob Sie jetzt versuchen, etwas zu unterdrücken, das Sie bereits explizit instanziiert haben.

    
Colin Robertson 24.09.2013 19:50
quelle