Si consideri il seguente:Template visibilità alias nella classe annidata
template<typename X>
struct Z {};
struct A
{
using Z = ::Z<int>;
struct B : Z
{
using C = Z;
};
};
Questo compila bene. Bello. Ma ora aggiungere un altro parametro nel Z
:
template<typename X, typename Y>
struct Z {};
struct A
{
template<typename X>
using Z = ::Z<X, int>;
struct B : Z<B>
{
using C = Z<B>; // error: too few template arguments for class template 'Z'
};
};
Ok, forse ha senso che la definizione di template alias Z
in classe A
è visibile quando derivante classe annidata B
, ma non all'interno del suo corpo, innescando l'errore dal momento che la la definizione globale di Z
ha due parametri.
Ma perché è il diverso comportamento nel primo caso, quando Z
è solo un tipo alias in A
?
Infine, fanno A
un modello:
template<typename X, typename Y>
struct Z {};
template<typename T>
struct A
{
template<typename X>
using Z = ::Z<X, int>;
struct B : Z<B>
{
using C = Z<B>;
};
};
Ora l'errore è andato. Perché?
(Testato su Clang 3.6 e GCC 4.9.2)
Wow. Questo è abbastanza chiaro, grazie. L'errore è apparso quando 'A' smesso di essere un modello, che ho pensato avrebbe semplificato molto il codice. Tuttavia, ora sono costretto a usare due nomi diversi per i due 'Z', il che rende il codice più brutto. Se c'è qualche soluzione migliore, per favore fatemelo sapere. – iavr
@iavr E riguardo 'usando C = Z;'? (Non funzionerà per il fatto che 'A' sia un modello) – Columbo
Ora è impressionante :-) Sì, funziona su questo codice semplificato qui, ma non sul mio originale (' nome tipo sconosciuto 'Z''). Dovrò controllare dov'è la differenza. 'A' non è più un modello, e ho intenzione di mantenerlo in questo modo. – iavr