这段特殊的代码在gcc 5.4上失败了,但是对于许多其他代码,msvc 2015,clang和更新版本的gcc都有效。
#include <boost/function.hpp>
#include <map>
#include <string>
typedef boost::function1<int, double> fn;
class fn_map : public std::map<std::string, fn> {
public:
void reg(const std::string&, fn);
};
int main(int, char**) {
fn_map fm;
struct {
int operator()(double v) {
return static_cast<int>(v * 2.);
}
} factory;
fm.reg("factory", factory);
}
void fn_map::reg(const std::string& nm, fn f) {
this->insert(std::make_pair(nm, f));
}
错误讯息:
no known conversion for argument 2 from 'main(int, char**)::<anonymous struct>' to 'fn {aka boost::function1<int, double>}'
最后一个ubuntu LTS仍然有gcc 5,所以如果可能的话我也想让这个代码在那里工作。
答案 0 :(得分:0)
将struct
定义从函数定义中移出到非匿名类型似乎解决了gcc上的这个特定问题。
#include <boost/function.hpp>
#include <map>
#include <string>
typedef boost::function1<int, double> fn;
class fn_map : public std::map<std::string, fn> {
public:
void reg(const std::string&, fn);
};
namespace {
struct factory_t {
int operator()(double v) {
return static_cast<int>(v * 2.);
}
};
}
int main(int, char**) {
fn_map fm;
factory_t factory;
fm.reg("factory", factory);
}
void fn_map::reg(const std::string& nm, fn f) {
this->insert(std::make_pair(nm, f));
}