7

Visual Studio 2013 (aggiornamento 2) genera un errore in fase di compilazione durante la compilazione di una funzione modello il cui tipo restituito è un nome di tipo nidificato, nascosto tramite ereditarietà multipla e reso nuovamente visibile con la parola chiave using; come nel codice seguente:Perché VC++ 2013 rifiuta di compilare i tipi annidati, resi visibili con la parola chiave using, quando usato come modello restituisce il tipo?

struct Base1 
{ 
    typedef int value_type; 
}; 

struct Base2 
{ 
    typedef double value_type; 
}; 

struct Derived : Base1, Base2 
{ 
    using Base1::value_type; 
}; 

template<typename T> 
typename T::value_type nullary_function() { return 0; } 

template<typename T> 
typename T::value_type unary_function(T t) { return 0; } 

int main() 
{ 
    nullary_function<Derived>(); // Error: C2770 
    unary_function(Derived()); // Error: C2893 
    return 0; 
} 

(. I numeri di errore variano a seconda se la funzione accetta argomenti di template o no, come mostrato nei commenti)

G ++ 4.7 accetta questo codice.

In particolare, mi piacerebbe sapere cosa ha da dire lo standard C++ sull'argomento e se questo è un bug del compilatore VC++. (Mi sembra che stia vedendo come rendere visibili i tipi nidificati con la parola chiave using in ogni altra situazione, per quanto ne sappia.)

Sono anche consapevole che la linea con la parola chiave using può essere cambiato da

using Base1::value_type; 

a

typedef Base1::value_type value_type; 

per ottenere il codice per compilare e funzionare correttamente, ma sembra male per portabilità per alcuni (potenzialmente) codice valido per compilare su alcuni compilatori e non altro rs - da qui il desiderio di chiarimenti.

+0

"sembra male per la portabilità" - un cinico potrebbe indicare che potrebbe essere nell'interesse di un fornitore di piattaforme per codice scritto per la loro piattaforma non portatile. Ma sono sicuro che c'è una ragione perfettamente innocente per l'interpretazione idiosincratica del linguaggio di questo compilatore. –

+0

L'ultimo aggiornamento è completamente interrotto nella mia esperienza. Le deduzioni di modelli che hanno funzionato in precedenza ora bloccano il compilatore! – Zoomulator

+0

FWIW, ho avuto alcuni problemi con 'using' vs.' typedef' con VS2013, sembra che non abbiano risolto tutti i problemi. Archivialo come bug sul sito Web di MS Connect e prosegui con 'typedef' fino a quando non lo risolvono. Potresti provare l'aggiornamento 3 VS2013, il supporto è migliore ma potrebbe non funzionare ancora. – Niall

risposta

0

Questo è in effetti un bug del compilatore: ICC, CLang e G ++ accettano tutti questo codice come verificato su Godbolt.

La lingua più applicabile nello standard sono riuscito a trovare è 7.3.3 (namespace.udecl) p2 (citato da N3337)

Ogni dichiarazione using è una dichiarazione e membro -dichiarazione e così può essere utilizzato in una definizione di classe.

P.S. ICC, CLang e G ++ accettano anche la versione typedef.

Problemi correlati