Поделиться через


Предупреждение компилятора (уровень 1) C4346

Обновлен: Ноябрь 2007

Сообщение об ошибке

"имя": зависимое имя не является типом.
'name': dependent name is not a type.

Требуется ключевое слово имя типа в случае, если зависимое имя должно обрабатываться как тип. Такие радикальные изменения в компилятор Visual C++ .NET 2003 были внесены в целях соответствия стандартам ISO C++.

Дополнительные сведения см. в разделе Сводная информация о критических изменениях времени компиляции.

Чтобы код функционировал одинаково во всех версиях Visual C++, следует добавить к объявлению typename.

Следующий пример демонстрирует причины возникновения ошибки 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;
};

В следующем примере демонстрируются другие случаи, когда необходимо использование ключевого слова имя типа:

// 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    
};

а также:

// 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
};