为什么在“typename Operation :: second_argument_type(x)”中使用typename?

时间:2014-04-03 09:03:54

标签: c++

这是bind2nd定义:

 template <class Operation, class T>
    binder2nd<Operation> bind2nd (const Operation& op, const T& x)
    {
      return binder2nd<Operation>(op, typename Operation::second_argument_type(x));
    }

关键字 typename 可用于:

  • 在模板声明中,typename可以用作替代 用于声明类型模板参数的类。

  • 在声明或模板定义中,typename可以是 用于声明依赖名称是一种类型。

所以,我认为typename用于声明Operation :: second_argument_type是一个类型,但我想知道为什么我们需要在这里使用typename?我们不能使用它吗?使用它有什么好处?

1 个答案:

答案 0 :(得分:0)

C ++语法取决于标识符是否为类型。没有这些知识就无法解析语句。

通常,编译器只查看标识符是否已声明为类型。但是,如果符号依赖于模板参数,则编译器无法查找。所以你必须告诉它。

如果您使用

Operation::second_argument_type

并且它是一种类型,编译将失败,因为模板已经被解析,假设它是一个对象,如果你使用

typename Operation::second_argument_type

并且它不是一个类型,编译将失败,因为模板已经被解析,假设它是一个类型。