C++ - 组合typedef和typename的语句的含义

Arv*_*ind 55 c++ typedef typename

在C++头文件中,我看到这段代码:

typedef typename _Mybase::value_type value_type;
Run Code Online (Sandbox Code Playgroud)

现在,据我所知,引用Schildt撰写的" C++完整参考文献 ".typename可以用关键字类代替,第二个用途typename是通知编译器模板声明中使用的名称是类型名而不是对象名.

同样,您可以使用关键字定义新的数据类型名称typedef.您实际上并未创建新数据类型,而是为现有类型定义新名称.

但是,您能否准确解释上述代码行的含义,在哪里typedeftypename哪些结合在一起.::声明中的" "是什么意思?

pip*_*289 57

typedef定义了一个在代码中使用的新类型,比如速记.

typedef typename _MyBase::value_type value_type;
value_type v;
//use v
Run Code Online (Sandbox Code Playgroud)

这里的typename让编译器知道这value_type是一个类型,而不是一个对象_MyBase.

::是该类型的范围.它有点像"在",所以value_type"在" _MyBase.或者也可以被认为是包含的.

  • 这里需要'typename'吗? (6认同)
  • 这取决于具体情况.如果_MyBase依赖于模板参数而不是yes(如果_MyBase是模板类型),否则您不应该这样做.如果您对上下文感到困惑,编译器会通过提供错误来帮助您. (3认同)
  • 当 _MyBase 是模板类型时,为什么需要 `typename` ?当 _MyBase 不是模板类型时,为什么不需要 `typename` ? (3认同)
  • @V.Wu 粗略地说,这是因为编译器在使用(实例化)模板类型之前无法查看模板类型的内部。因此,为了使其成为有效的语法,程序员必须澄清 value_type 是否是类型,即是否具有 typename (它是成员变量或方法)。 (2认同)

Pau*_*ans 7

typename也就是说,这是_Mybase::value_type类型的名称,因此typedef可以依赖这个事实。

  • 如果我不包含它会发生什么变化?它无法编译,是否缺少一些警告?我以为 typedef AB;在所有情况下都能正常工作。 (13认同)
  • 如果有人能回答@masterxilo 的评论,那就太好了,因为我只是在想同样的事情。 (7认同)
  • @RastaJedi 至少在 Visual Studio 中,在这种情况下似乎不需要“typename”。除非您当前定义的类是模板化的,否则放置它甚至是错误的:`typedef int Int; template<类型名称 T> struct B { typedef 类型名称 Int IInt; };` 很好,但是 `typedef int Int; struct B { typedef 类型名 Int IInt; };` 不是。 (2认同)