模板类调用嵌套模板成员函数GCC编译报错,求解决方法
问题:GCC-8.5编译嵌套模板代码失败及解决方法
出错代码
使用GCC-8.5编译以下C++代码时失败:
template<typename num> struct A { template<int y> num run(num x) { return x + y; } }; template<typename num> struct B { A<num> a; num run(num x) { if (x > 1) return a.run<1>(x); return a.run<0>(x); } }; // [[Rcpp::export]] double test(double x) { B<double> b; return b.run(x); }
错误信息
编译时触发如下错误:
invalid operands of types ‘<unresolved overloaded function type>’ and ‘int’ to binary ‘operator<’ --- if (x > 1) return a.run<1>(x);
可编译的两种场景
- 移除struct B的template声明后,代码可正常编译:
template<typename num> struct A { template<int y> num run(num x) { return x + y; } }; struct B { A<double> a; double run(double x) { if (x > 1) return a.run<1> (x); return a.run<0> (x); } }; // [[Rcpp::export]] double test(double x) { B b; return b.run(x); }
- 移除第一段代码中的
test函数也能编译通过。
问题
如何修改第一段代码使其正常工作?是否该代码本身存在固有问题?
修复方案
在调用模板成员函数run时,需要添加template关键字明确告知编译器这是一个模板函数,修改后的代码可正常编译:
template<typename num> struct A { template<int y> num run(num x) { return x + y; } }; template<typename num> struct B { A<num> a; num run(num x) { if (x > 1) return a.template run<1>(x); return a.template run<0>(x); } }; // [[Rcpp::export]] double test(double x) { B<double> b; return b.run(x); }
原因说明
在模板类B中,成员a的类型A<num>依赖于模板参数num,此时编译器无法自动推断a.run是一个模板函数,会将a.run<1>中的<解析为小于运算符,从而触发语法错误。添加template关键字后,编译器会正确识别run是模板成员函数,进而正确解析模板参数。
内容的提问来源于stack exchange,提问作者user2961927
相关产品推荐
相关产品推荐

