0

次のデータ型があります。

struct Item { double a, b; Item (double a_, double b_): a(a_), b(b_){}};
typedef std::pair <double, Item> TPair;
typedef std::vector <TPair> TData;

2つのベクトルをペアのベクトルにコピーしたい:

int main(int argc, char* argv[])
{
    std::vector <double> t1;
    std::vector <Item> t2;

    TData data;

    //Error
    std::transform (t1.begin(), t1.end(), data.begin(), 
            std::bind2nd( std::ptr_fun( std::make_pair <double,Item > ), double() ) );
}

しかし、コンパイラは次のエラーで停止します。

Error   1   error C2784: 'std::pointer_to_binary_function<_Arg1,_Arg2,_Result,_Result(__fastcall *)(_Arg1,_Arg2)> 
std::ptr_fun(_Result (__fastcall *)(_Arg1,_Arg2))' : could not deduce template argument for 'overloaded function type' from 'overloaded function type'
Error   2   error C2784: 'std::pointer_to_binary_function<_Arg1,_Arg2,_Result,_Result(__fastcall *)(_Arg1,_Arg2)> 
std::ptr_fun(_Result (__fastcall *)(_Arg1,_Arg2))' : could not deduce template argument for 'overloaded function type' from 'overloaded function type'

問題はどこだ?ご協力いただきありがとうございます。コンパイラMSVS2010x86。私はBoostのないソリューションを好みます。

更新された質問 dasblinkenlightによってエラーが見つかりました。修正されたコードは次のとおりです。

std::transform (t1.begin(), t1.end(), data.begin(), std::bind1st( std::ptr_fun( std::make_pair <double,Item > ), double() ) );

しかし、コンパイラは同じエラーを示します...

4

3 に答える 3

1

の2番目のパラメータはでstd::make_pair<double,Item>はありItemませんdoublestd::bind1st代わりに使いたいと思います。

于 2012-01-19T23:16:50.193 に答える
1

の2番目の引数make_pair<double,Item>Item、ではなく、doubleです。

std::transform (t1.begin(), t1.end(), data.begin(),
     std::bind2nd( std::ptr_fun( std::make_pair <double,Item > ), Item(0,0) ) );

make_pair編集:MS VSの場合、次のように定義しました。

std::pair<double,Item> make_pair(const double db, const Item it) {
    return std::pair<double,Item>(db, it);
}

次に、呼び出しは次のようになります。

std::transform (t1.begin(), t1.end(), data.begin(),
     std::bind2nd( std::ptr_fun<double,Item,std::pair<double,Item> >( make_pair), Item(0,0) ) );
于 2012-01-19T23:28:35.073 に答える
1

非推奨のバインダーは、基本的に解決が不可能なもの(複数の引数、複数の引数、不明な戻り値を持つメンバー関数)にぶつかる前に数メートルしかかからないため、使用しないでください。 C++11ラムダとは互換性がありません。ある程度の前方互換性のために使用します boost::bind。コードは事実上次のようになります。

boost::bind(make_pair<double, Item>, double(), _1);

テンプレートmake_pair引数で修飾することも必要になりますstd::bind1stbind1st他の人が指摘しているように、引数を間違った位置にバインドしているため)。

追加のボーナスとして、C ++ 03ソリュ​​ーション:

std::bind1st(std::ptr_fun(std::make_pair<int, Item>), int());

不思議なことに、これは4.6.2のC++11ではコンパイルされません。理由はまだわかりません。しかし、非推奨のバインダーを使用すべきでない理由を良い例として取り上げてください。

于 2012-01-19T23:29:23.857 に答える