Ci sono due casi in cui typedef
mi confonde quando si tratta di extern template declaration
e explicit template instantiation
.utilizzando typedef nell'istanza modello e nella dichiarazione modello esterno
Per illustrare i due vedi sotto 2 esempi di frammenti di codice.
consideri seguente esempio (caso 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>;
Perché l'template class example<type_string>
lavoro con typedef? e perché è valido mentre template class string_example
non lo è?
consideri seguente esempio (Caso 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?
Come messo in discussione nel commento di cui sopra, è valido per utilizzare typedef in extern template declaration
, come nell'esempio di cui sopra, e perché questo compilare a differenza del Case1 dove non lo fa.
Ho letto di casi simili ma nessuno fornisce la risposta dettagliata a sopra 2 domande. l'elaborazione dettagliata è molto apprezzata!
Sapete perché 'classe di esempio template,' e 'extern classe template esempio ;' funziona (o non è così con GCC), sto usando MSVC-140 btw e funziona. grazie mille! –
codekiddy
'esempio' si qualifica come * semplice-modello-id *. –
grazie, ho fatto alcuni test con GCC e ci sono casi in cui g ++ emette riferimenti indefiniti per casi come 'esempio' ma msvc compila bene, ci sono anche casi in cui msvc fornisce avvertimenti ma non g ++, ovviamente questi casi sono né descritto né ben definito dallo standard. –
codekiddy