[英]Error when passing template template parameter with dependent nested parameters types
[英]Error when passing template parameters to inner structure
我尝试编译以下C ++代码:
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 >()
)可以正常编译。 有趣的是,如果删除行template< typename T >
,则编译成功。 但是,由于在最小(非)工作示例中未出现该原因,因此需要该行。 怎么了
在这种情况下, A2
实际上是B<T>::A2
的简写。 由于A2
是依赖于模板参数T
的类型,因此您必须使用显式template
关键字引用其成员模板。
a2.template fun< true >();
A
不是从属类型,并且其成员模板可以使用“普通”语法来引用,而无需该额外的template
关键字。
参见14.2 / 4和那里的类似示例
14.2模板专长的名称[临时名称]
4当成员模板专业名称出现在之后
.
或->
在postfix-expression中,或者在qualified-id中的嵌套名称说明符之后,并且postfix-expression的对象表达式取决于类型,或者qualified-id中的nested-name-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 }
—末例]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.