2016-02-14 71 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