Vorlage Nicht-Typ-Parameter?

8

Sehen Sie sich diesen Code an:

%Vor%

Wenn ich das mit Visual C ++ 2013 November CTP kompiliere, bekomme ich:

"Fehler C2970: 'g': Vorlagenparameter 'temp': 's': Ein Ausdruck, der Objekte mit interner Verknüpfung enthält, kann nicht als Nicht-Typ-Argument verwendet werden"

Allerdings habe ich im C ++ 14 Standard (14.3.2 [temp.arg.nontype]) folgendes gelesen:

"ein konstanter Ausdruck (5.19), der die Adresse eines vollständigen Objekts mit statischer Speicherdauer und externer oder interner Verknüpfung oder"

bezeichnet

Ich interpretiere dies als "konstanten Ausdruck mit statischer Speicherdauer und externer Verknüpfung" oder "konstanter Ausdruck mit statischer Speicherdauer und interner Verknüpfung". In meinem obigen Beispiel ist die Variable s nicht ein "konstanter Ausdruck mit statischer Speicherdauer und interner Verknüpfung"?

Wenn ich s ändere:

std :: string s="abc";

Dann kompiliert es und es funktioniert, aber ist das nicht gegen den Standard, weil s jetzt kein "konstanter Ausdruck" mehr ist.

Kann jemand etwas Licht darauf werfen? Unterscheide ich hier etwas falsch?

    
Marc G 17.06.2014, 19:11
quelle

2 Antworten

8

In C ++ 98 war die Sprache (ab 14.3.2 / 1): the name of an object or function with external linkage... . Die Änderung, um interne Verknüpfungen zuzulassen, wurde in C ++ 11 aufgenommen.

Ihr Compiler kompiliert wahrscheinlich nur als C ++ 98 (oder 03) Standard, nicht C ++ 11.

    
Mark B 17.06.2014, 19:21
quelle
11

Ersetzen Sie static durch extern :

%Vor%

Der Grund ist, dass in C ++ 98 / C ++ 03 Verweise mit interner Verknüpfung als Template-Argument nicht erlaubt waren.

Beachten Sie auch, dass nur das Entfernen von static nur würde nicht funktionieren, wenn const vorhanden ist, weil const Objekte deklariert sind Namespace-Level hat eine interne Verknüpfung (es sei denn, es wird extern deklariert). Sie müssen extern wie oben gezeigt verwenden.

    
Nawaz 17.06.2014 19:23
quelle

Tags und Links