You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

模板类调用嵌套模板成员函数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:01:36