2016-02-14 74 views
0

這段代碼可以在VS2013正確運行,並且輸出:
你好,133
你好,233
,但在代碼::塊(使用GCC編譯器和在一個Ubuntu系統),編譯器告訴我:嵌套℃的情況下++模板

|| ===構建:調試test_sth(編譯器:GNU GCC編譯器)=== |
在成員函數'void A :: say()'中:
line 28錯誤:''''令牌之前的預期主表達式
在'void A :: say()[with C = B]'的實例化中' :
線31從這裏需要
第28行錯誤:類型的無效操作數「<懸而未決重載的函數類型>」和「INT」爲二進制「運算符<」
|| ===建立失敗:2錯誤(S ),2次警告(0分鐘,0秒)=== |

有沒有人可以告訴我什麼是錯的,爲什麼?

第28行是:this-> c.Match < 233>();
第31行是:模板結構A < B < int>>;

#include "stdio.h" 

using namespace std; 

template<typename C> 
struct A 
{ 
    C c; 
    void say(); 
}; 

template<typename C> 
class B 
{ 
    C name; 
    public: 
    template<int D> 
    void Match() 
    { 
     printf("hello,%d\n",D); 
    } 
}; 

template<typename C> 
void A<C>::say() 
{ 
    this->c.Match<233>(); 
} 

template struct A<B<int>>; 

int main() 
{ 
    A<B<int>> a1; 
    a1.c.Match<133>(); 
    a1.say(); 
    getchar(); 
    return 0; 
} 
+2

'這個 - > c.template匹配<233>();' – cpplearner

回答

1

以下是從http://www-01.ibm.com/support/knowledgecenter/SSQ2R2_8.0.3/com.ibm.xlcpp111.aix.doc/language_ref/keyword_template_qualifier.html採取:

使用關鍵字模板作爲資格賽從其他實體區分成員模板。下面的例子說明,當你必須使用模板作爲一個限定:

class A 
{ 
    public: 
    template<class T> T function_m() { }; 
}; 

template<class U> void function_n(U argument) 
{ 
    char object_x = argument.function_m<char>(); // ill-formed 
} 

在這個例子中,變量object_x的定義是非法的構造。編譯器假定符號<是一個小於運算符。爲了讓編譯器識別模板函數調用,您必須添加模板預選賽:

char object_x = argument.template function_m<char>(); 
+0

感謝和我也發現了這一點:HTTP:/ /stackoverflow.com/questions/1574721/g-doesnt-like-template-method-chaining-on-template-var?rq=1 – aicco