Perché è che caso non corretto (è logico)typedef e il modello di parametro con lo stesso nome
template <typename T>
struct Der: public Base
{
typedef int T;
T val;
};
, ma questo caso è corretto?
struct Base
{
typedef int T;
};
template <typename T>
struct Der: public Base
{
T val;
};
Lo Standard 14.6.1/7 dice:
Nella definizione di un modello di classe o nella definizione di un membro di tale modello che appare al di fuori della definizione del modello, per ogni classe base che non dipende da un parametro template (14.6.2), se il nome della classe base o il nome di un membro della classe base è uguale al nome di un parametro template, il nome della classe base o nome utente nasconde il nome del parametro template (3.3.7).
Perché non è ambiguo qui?
Grazie per la risposta, ma quali sono le ragioni di tale comportamento? – user3514538
@ user3514538 La ridichiarazione di un parametro del modello probabilmente causerebbe problemi con [basic.scope.class]/1 - un paragrafo importante. Per non parlare dell'ODR. Tuttavia, riguardo al secondo bit, non ne sono sicuro. Dovremmo aspettare per hvd: o) – Columbo
Questo sembra essere soggetto a [CWG 591] (http://open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#591), anche se questo limita solo questo regola per classi base non dipendenti. – dyp