Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Aggiornamento: novembre 2007
Messaggio di errore
'nome': il nome dipendente non è un tipo
'name' : dependent name is not a type
Se un nome dipendente deve essere trattato come un tipo, è richiesta la parola chiave typename. Si tratta di una nuova modifica del compilatore Visual C++ .NET 2003, effettuata in conformità allo standard ISO C++.
Per ulteriori informazioni, vedere Riepilogo delle ultime modifiche in fase di compilazione.
Affinché il codice funzioni allo stesso modo in tutte le versioni di Visual C++, aggiungere typename alla dichiarazione.
Nell'esempio seguente viene generato l'errore C4346:
// C4346.cpp
// compile with: /WX /LD
template<class T>
struct C {
T::X* x; // C4346
// try the following line instead
// typename T::X* x;
};
Negli esempi seguenti sono illustrati altri casi in cui è richiesta la parola chiave typename:
// C4346b.cpp
// compile with: /LD /W1
template<class T>
const typename T::X& f(typename T::Z* p); // Required in both places
template<class T, int N>
struct L{};
template<class T>
struct M : public L<typename T::Type, T::Value>
{ // required on type argument, not on non-type argument
typedef typename T::X Type;
Type f(); // OK: "Type" is a type-specifer
typename T::X g(); // typename required
operator typename T::Z(); // typename required
};
e
// C4346c.cpp
// compile with: /LD /WX
struct Y {
typedef int Y_t;
};
template<class T>
struct A {
typedef Y A_t;
};
template<class T>
struct B {
typedef /*typename*/ A<T>::A_t B_t; // C4346 typename needed here
typedef /*typename*/ B_t::Y_t B_t2; // typename also needed here
};