2015-12-29 9 views
5

Es gibt zwei Fälle, in denen typedef mich verwirrt, wenn es extern template declaration und explicit template instantiation kommt.mit typedef in Vorlage Instanziierung und externe Vorlage Erklärung

Zur Veranschaulichung der beiden siehe unten 2 Beispiel Code-Schnipsel.

Betrachten wir folgendes Beispiel (Fall 1):

// suppose following code in some cpp file  
template <typename T> 
    struct example 
{ 
    T value; 
}; 

// valid typedefs 
typedef example<int> int_example; 
typedef example<std::string> string_example; 

// explicit instantiation using above typedefs 
template class int_example; // -> compile time error 
template class string_example; // -> compile time error 

// instead we need to use type names 
template class example<int>; // -> OK 
template class example<std::string>; // -> OK 

// QUESTION 1: Why does this work however? is this valid code? 
typedef std::string type_string; 
template class example<type_string>; 

Warum hat die template class example<type_string> Arbeit mit typedef? und warum ist es gültig, während template class string_example nicht ist?

Betrachten wir folgendes Beispiel (Fall 2):

// suppose following code is in some header file 
template <typename T> 
struct example 
{ 
    T value; 
}; 

// valid typedefs 
typedef std::string type_string; 
typedef example<type_string> string_example; 

// Explicit instantiation declaration 
// QUESTION 2: Is this valid code? if not why not? 
extern template string_example; // -> at least this compiles, but is it OK? 

Wie oben im Kommentar in Frage gestellt, ist es gültig oben in extern template declaration, wie im Beispiel zu verwenden typedef, und warum dies im Gegensatz zu den nicht kompiliert Case1 wo nicht.

Ich habe über ähnliche Fälle gelesen, aber keine gibt die detaillierte Antwort auf die obigen 2 Fragen. detaillierte Ausarbeitung wird sehr geschätzt!

Antwort

2
template class int_example; 

ist nicht zulässig. Aus dem C++ 11 Stanard:

14.7.2 Explizite Instanziierung

2 Die Syntax für explizite Instanziierung ist:

explizite-Instanziierung:
extern opttemplateDeklaration

Es gibt zwei Formen der expliziten Instanziierung: eine explizite Instanziierungsdefinition und eine explizite Instanziierungsdeklaration. Eine explizite Instanziierungserklärung beginnt mit dem Schlüsselwort extern.

3 Wenn die explizite Instanziierung für eine Klasse oder ein Mitglied der Klasse ist, die erarbeitet-Typ-Spezifizierer in der Erklärung wird einen einfach-template-ID enthalten.

simple-Template-ID ist in Abschnitt A definiert 12 Vorlagen als:

einfach-template-ID:
template-name<Template-Argument-Liste opt>

int_example nicht als qualifiziert simple-template-id.
example<int> qualifiziert sich als Simple-Template-ID.

jedoch von dieser Logik

extern template string_example; 

ist entweder nicht legal. Ich weiß nicht, wie es für dich funktioniert. Ich habe den folgenden Fehler erhalten, als ich versuchte, eine solche Zeile in g ++ 4.9.3 zu kompilieren.

socc.cc:15:31: error: expected unqualified-id before ‘;’ token 
extern template string_example; // -> compile time error 
+0

wissen Sie, warum 'Template-Klasse Beispiel ;' und 'extern Template-Klasse Beispiel ;' funktioniert (oder es funktioniert nicht mit GCC), ich btw MSVC-140 bin mit und es funktioniert. vielen Dank! – codekiddy

+0

'Beispiel ' qualifiziert als * Simple-Template-ID *. –

+0

Danke, ich habe einige Tests mit GCC gemacht und es gibt Fälle, wo g ++ undefinierte Referenzen für Fälle wie 'Beispiel ' ausgibt, aber msvc kompiliert einfach gut, es gibt auch Fälle, in denen msvc Warnungen gibt, aber nicht g ++, offensichtlich sind diese Fälle weder beschrieben noch durch den Standard gut definiert. – codekiddy