我在编译以下代码段时遇到问题
int temp;
vector<int> origins;
vector<string> originTokens = OTUtils::tokenize(buffer, ","); // buffer is a char[] array
// original loop
BOOST_FOREACH(string s, originTokens)
{
from_string(temp, s);
origins.push_back(temp);
}
// I'd like to use this to replace the above loop
std::transform(originTokens.begin(), originTokens.end(), origins.begin(), boost::bind<int>(&FromString<int>, boost::ref(temp), _1));
有问题的函数是
// the third parameter should be one of std::hex, std::dec or std::oct
template <class T>
bool FromString(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&) = std::dec)
{
std::istringstream iss(s);
return !(iss >> f >> t).fail();
}
我得到的错误是
1>Compiling with Intel(R) C++ 11.0.074 [IA-32]... (Intel C++ Environment)
1>C:\projects\svn\bdk\Source\deps\boost_1_42_0\boost/bind/bind.hpp(303): internal error: assertion failed: copy_default_arg_expr: rout NULL, no error (shared/edgcpfe/il.c, line 13919)
1>
1> return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
1> ^
1>
1>icl: error #10298: problem during post processing of parallel object compilation
谷歌异常无益,所以我希望这里的某些人可以提供一些见解。
UPDATE :问题由@ gf的解决方案回答,但有趣的是原始功能不太正确,因为它存储了转换操作的结果(失败/未失败)而不是转换后的值本身。我更改了签名直接返回转换后的值,编译器能够正确推断绑定的类型。
// new signature
T FromString(const std::string& s, std::ios_base& (*f)(std::ios_base&) = std::dec);
// revised calling syntax - note that bind<int> is not required.
transform(originTokens.begin(), originTokens.end(), origins.begin(), bind(&FromString<int>, _1, std::dec));
答案 0 :(得分:5)
FromString()
需要3个参数,默认参数不是函数类型的一部分。因此绑定表达式应该类似于:
boost::bind<int>(&FromString<int>, boost::ref(temp), _1, std::dec);
答案 1 :(得分:0)
boost :: bind不支持函数模板。您应该将该函数转换为函数对象:
template< typename T>
struct from_string {
bool operator()(T& t, std::string const& s, std::ios_base& (*f)(std::ios_base&) = std::dec) {
std::istringstream iss(s);
return !(iss >> f >> t).fail();
}
};
用法:
boost::bind< bool >(from_string< int >(), boost::ref(temp), _1)