簡體   English   中英

從模板函數調用的模板類的模板成員函數

[英]template member function of template class called from template function

這不編譯:

template<class X> struct A {
   template<int I> void f() {}
};

template<class T> void g()
{
   A<T> a;
   a.f<3>();  // Compilation fails here (Line 18)
}

int main(int argc, char *argv[])
{
   g<int>();  // Line 23
}

編譯器(gcc)說:

hhh.cpp:在函數“void g()”中:

hhh.cpp:18: 錯誤:')' 標記前的預期主表達式

hhh.cpp:在函數“void g() [with T = int]”中:

hhh.cpp:23:從這里實例化

hhh.cpp:18: 錯誤:成員的無效使用(您是否忘記了“&”?)

誰能解釋這是為什么? 有沒有辦法讓它工作?

試試下面的代碼:

template<class T> void g()
{
   A<T> a;
   a.template f<3>();  // add `template` keyword here
}

根據 C++'03 標准 14.2/4:

當成員模板特化的名稱出現在. ->后綴表達式中,或在限定 id中的嵌套名稱說明符之后,並且后綴表達式或限定 id 顯式依賴於模板參數(14.6.2),成員模板名稱必須是以關鍵字template為前綴。 否則,假定該名稱命名為非模板。

根據 n2857 14.3/4 草案,未來的 C++ 標准似乎仍然需要這個關鍵字。 一些編譯器具有特殊模式,允許無錯誤地編譯原始代碼(Comeau 以所謂的放松模式編譯它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM