2015-04-17 10 views
24

Wenn ich den folgenden Code haben:Instanziierung Vorlage

template <typename T = int> 
struct mystruct { 
    using doublestruct = mystruct<double>; 
} 

mystruct<>::doublestruct obj; 

Hat instanziiert dies die mystruct<int> Vorlage überhaupt? Oder nur die mystruct<double> wird instanziiert?

+0

testen Sie haben nicht den "T" -Typ in der Vorlage verwendet. Was versuchen Sie mit einer solchen Vorlage zu erreichen? –

+3

@MykhayloKopytonenko: Es ist ein künstliches Beispiel. Ein sehr guter Testfall. Er fragt, ob eine Vorlage instanziiert wird, wenn sie nur benannt wird, um einen [nicht abhängigen] Elementtyp anzugeben, der darin deklariert ist. –

Antwort

18

Ja, es muss mystruct<int> instanziieren, um auf seine Mitglieder zuzugreifen und die Bedeutung von doublestruct zu bestimmen. Sie könnten dies mit einem static_assert:

#include <type_traits> 

template <typename T = int> 
struct mystruct { 
    static_assert(!std::is_same<T,int>::value, ""); 
    using doublestruct = mystruct<double>; 
}; 

mystruct<>::doublestruct obj;  // assertion fails for T==int 
mystruct<char>::doublestruct obj; // OK, not instantiated for int 
+1

mebe etwas anderes als "double" für diese Demonstration verwenden; irgendwie verwirrend –

+0

@LightningRacisinObrit: OK, denke ich. –

16

Ja, es muss instanziiert werden; doublestruct ist ein Mitglied der Instantiierung. Wenn Sie also keine Instanziierung haben, haben Sie keine doublestruct.

[C++11: 14.7.1]: Es sei denn, eine Klasse-Template Spezialisierung explizit instanziiert wurde (14.7.2) oder explizit spezialisiert (14.7.3), wird die Klasse Template-Spezialisierung implizit instanziiert, wenn die Spezialisierung in einem Kontext Bezug genommen wird, die eine completely- erfordert definierter Objekttyp oder wenn die Vollständigkeit der Klassenart Auswirkungen auf die Semantik des Programms hat. [..]

Insbesondere die möglichen Auswirkungen von Spezialisierungen von mystruct berücksichtigen, die nicht Mitglied doublestruct oder kann enthalten ein enthalten, die nicht ein Typ ist.