用于增强函数转换的匿名结构在gcc 5.4

时间:2017-12-28 13:50:36

标签: c++ gcc

这段特殊的代码在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,所以如果可能的话我也想让这个代码在那里工作。

1 个答案:

答案 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));
}