使用boost::variant时出现No matching function for call报错如何解决
问题核心原因
- 你定义的
operator()是const修饰的成员函数,不允许修改Operation类的普通成员变量predictions、probabilities(演示代码里的a、b),而你调用的Classify/operate方法明显需要修改这几个入参,触发编译错误。 - 如果你调用的
Classify/operate是模板类的模板方法,在依赖模板参数的语境下调用需要加template关键字,否则编译器会把<解析为小于运算符,无法匹配到正确的函数。 - 值传递的obj会触发类拷贝,如果
RandomForest/ClassA没有可访问的拷贝构造函数,也会引发报错。
解决方案
按如下步骤修改代码即可解决:
- 移除
operator()的const修饰,允许修改类成员变量 - 将入参改为引用类型,避免不必要的类拷贝,也兼容会修改obj自身状态的成员函数调用
- 调用模板方法时显式加
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。
相关产品推荐
相关产品推荐

