这是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?我们不能使用它吗?使用它有什么好处?
答案 0 :(得分:0)
C ++语法取决于标识符是否为类型。没有这些知识就无法解析语句。
通常,编译器只查看标识符是否已声明为类型。但是,如果符号依赖于模板参数,则编译器无法查找。所以你必须告诉它。
如果您使用
Operation::second_argument_type
并且它是一种类型,编译将失败,因为模板已经被解析,假设它是一个对象,如果你使用
typename Operation::second_argument_type
并且它不是一个类型,编译将失败,因为模板已经被解析,假设它是一个类型。