c++ - 为什么 'typedef' 这个词后面需要 'typename' 作为依赖类型?

标签 c++ typedef typename

依赖类型通常需要 typename 来告诉编译器成员是类型,而不是函数或变量。

然而,情况并非总是如此。
例如,基类不需要这个,因为它只能是一个类型:

template<class T> struct identity { typedef T type; }
template<class T> class Vector : identity<vector<T> >::type { };  // no typename

现在我的问题是,为什么 typedef 之后需要 typename

template<class T> class Vector
{
    typedef typename /* <-- why do we need this? */ vector<T>::iterator iterator;
};

最佳答案

typedef 不需要出现在类型之前。

template <typename T>
struct S { typedef T type; };
template <typename T>
void f() { typename S<T>::type typedef t; }

这是完全有效的,在这种情况下,我希望您能理解如果 typename 是可选的,解析会很复杂。

我能理解

template <typename T>
void f() { typedef S<T>::type t; }

可以有不同的解释,但这会引入意想不到的情况,即 typedef 关键字的位置突然变得重要。

关于c++ - 为什么 'typedef' 这个词后面需要 'typename' 作为依赖类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21625119/

相关文章:

c++ - 如何将 Boost 集成到 Visual C++ 项目中?

c - C 中的 Typedef,使用 * 这是做什么的?

c++ - 在c++代码中,下列关键字是什么意思? SIGSELECT、U32、U16、U8

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

c++ - 使用函数模板将迭代器返回到图节点

C++ Lambda 函数转换错误

c++ - 无法使用 opencv 执行简单程序,错误 "Can' t 找不到程序的入口点”

c++ - 在循环中使用自动错误 "auto must have an initializer"

c++ - 无法使用::SendInput() 将退格键发送到写字板应用程序

c++ - 模板化 typedef 语句