4

次のスニペットのコンパイルに問題があります

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

グーグルは非常に役に立たないので、ここで誰かが洞察を提供できることを願っています.

更新: 質問は @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));
4

2 に答える 2

4

FromString()は 3 つの引数を取り、デフォルトの引数は関数型の一部ではありません。したがって、バインド式はおそらく次のようになります。

boost::bind<int>(&FromString<int>, boost::ref(temp), _1, std::dec);
于 2010-04-26T09:59:16.727 に答える
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)
于 2010-04-26T09:55:37.580 に答える