我尝试编译以下C ++代码:
recursive_function(*rai)
编译器抱怨说:
struct A {
template< bool x >
bool fun() {
return x;
}
};
template< typename T >
struct B {
struct A2 {
template< bool x >
bool fun() {
return x;
}
};
void test() {
A a;
A2 a2;
a.fun< true >();
a2.fun< true >();
}
};
但是上面的行(source_file.cpp: In member function ‘void B<T>::test()’:
source_file.cpp:22:24: error: expected primary-expression before ‘)’ token
a2.fun< true >();
^
)编译得很好。有趣的是,如果我删除行a.fun< true >()
,则编译成功。但是,由于最小(非)工作示例中未出现的原因,该行是必需的。这有什么不对?
答案 0 :(得分:2)
在此背景下,A2
实际上是B<T>::A2
的简写。由于A2
是依赖于模板参数T
的类型,因此您必须使用明确的template
关键字引用其成员模板
a2.template fun< true >();
A
不是依赖类型,其成员模板可以用&#34; plain&#34;来引用。没有额外template
关键字的语法。
参见14.2 / 4和类似的例子
14.2模板专精的名称[temp.names]
4 当成员模板专精的名称出现在后缀表达式中的
.
或->
之后或之后 qualified-id 中的嵌套名称说明符, postfix-expression 的对象表达式取决于类型或嵌套名称 qualified-id 中的-specifier 是指依赖类型,但名称不是当前实例化的成员(14.6.2.1),成员模板名称必须以前缀为前缀关键字template
。 否则,假定该名称命名非模板。 [例如:struct X { template<std::size_t> X* alloc(); template<std::size_t> static X* adjust(); }; template<class T> void f(T* p) { T* p1 = p->alloc<200>(); // ill-formed: < means less than T* p2 = p->template alloc<200>(); // OK: < starts template argument list T::adjust<100>(); // ill-formed: < means less than T::template adjust<100>(); // OK: < starts template argument list }
-end example]