Avertissement du compilateur (niveau 1) C4346
'name' : le nom dépendant n’est pas un type
Le nom de type mot clé est requis si un nom dépendant doit être traité comme un type. Pour le code qui fonctionne de la même façon dans toutes les versions de Visual C++, ajoutez-y typename
la déclaration.
L’exemple suivant génère l’erreur 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;
};
Les exemples suivants montrent d’autres exemples dans lesquels la typename
mot clé est requise :
// 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
};
et cela,
// 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
};