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

使用boost::variant时出现No matching function for call报错如何解决

问题核心原因
  • 你定义的operator()是const修饰的成员函数,不允许修改Operation类的普通成员变量predictions、probabilities(演示代码里的a、b),而你调用的Classify/operate方法明显需要修改这几个入参,触发编译错误。
  • 如果你调用的Classify/operate是模板类的模板方法,在依赖模板参数的语境下调用需要加template关键字,否则编译器会把<解析为小于运算符,无法匹配到正确的函数。
  • 值传递的obj会触发类拷贝,如果RandomForest/ClassA没有可访问的拷贝构造函数,也会引发报错。
解决方案

按如下步骤修改代码即可解决:

  1. 移除operator()的const修饰,允许修改类成员变量
  2. 将入参改为引用类型,避免不必要的类拷贝,也兼容会修改obj自身状态的成员函数调用
  3. 调用模板方法时显式加template关键字(如果Classify是模板方法的话)

修改后的业务代码示例:

struct Output{
  Row<size_t> predictions;
  mat probabilities;
};
typedef boost::variant<RandomForest<GiniGain, RandomDimensionSelect>, RandomForest<>> RandomForestGeneric;

class Operation: public boost::static_visitor<Output>
{
public:
    mat dataset;
    Row<size_t> predictions;
    mat probabilities;
    
    Output operator()(RandomForest<GiniGain, RandomDimensionSelect>& obj)
    {
        obj.Classify(dataset, predictions, probabilities);
        // 如果上面调用仍报错,改为显式指定模板参数的写法:
        // obj.template Classify<GiniGain, RandomDimensionSelect>(dataset, predictions, probabilities);
        return Output{predictions, probabilities};
    }
    
    Output operator()(RandomForest<>& obj)
    {
        obj.Classify(dataset, predictions, probabilities);
        return Output{predictions, probabilities};
    }
};

内容的提问来源于stack exchange,提问作者Ambi。

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:45:08