[英]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.