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!
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
'Beispiel' qualifiziert als * Simple-Template-ID *. –
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