编译器错误没有意义(错误是缺少函数的参数)

时间:2011-01-31 16:32:28

标签: c++ templates

我收到编译错误:

错误:没有匹配函数来调用buildTransFunc(<unresloved overloaded function type>, boost::function<EnumType(short int)>, EnumTypeToStringTranslator&)

buildTransFunc的声明如下:

template<typename RT, typename func, typename... Args>
RT buildTransFunc(func f, Args... args)
{
    return RT(boost::bind(f, _1, args...));
}

我按以下方式调用上述内容:

typedef boost::function<std::string (short int)> toASCIITranslator;
toASCIITranslator temp = buildTransFunction<toASCIITranslator, std::string (*) (short int, boost::function<EnumType(short int)>, EnumTypeToStringTranslatorType&), boost::function<EnumType(short int)>, EnumTypeToStringTranslatorType& >
(&Translator<std::string, forward_trans, short int, boost::function<EnumType (short int)>, EnumTypeToStringTranslatorType>, boost::function<EnumType(short int)(&enumChecker), EnumTypeToStringTranslator);

错误消息似乎正在跳过错误消息中的std :: string(*)(short int,boost :: function,EnumTypeToStringTranslatorType&amp;)参数,因为其他所有内容都在其中。

我正在使用GCC 4.5.2作为编译器。

翻译功能的声明是:

template<typename RT, typename D, typename... Args>
RT Translator(Args... args)
{
    return static_cast<RT>(translate<RT, D>(args...));
}

翻译功能可以在这个问题中找到: Translate

修改 更正了对buildTransFunction的调用以完成指定参数。

使用的g ++参数:-std = c ++ 0x。

1 个答案:

答案 0 :(得分:1)

我猜这个问题的道德是不要试图过于花哨......因为这是有效的 通过参数清楚地调用boost :: bind,而不是通过一个单独的函数转发它们。

所以不要这样:

toASCIITranslator temp = buildTansFunc<.....>(....);

就这样打电话:

toASCIITranslator temp = boost::bind(&Translator<std::string, forward_trans, short int, boost::function<EnumType(short int), EnumToStringTranslatorType&>, 
                         _1, 
                         boost::function<EnumType(short int)>(&enumChecker),
                         EnumToStringTranslator);