C ++,不能将2个向量复制到对的向量

时间:2012-01-19 23:12:58

标签: c++ vector copy std-pair

有以下数据类型:

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'

问题出在哪里?谢谢你的帮助。编译器MSVS 2010 x86。我更喜欢没有Boost的解决方案。

更新了问题 dasblinkenlight发现了一个错误,修正后的代码:

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

但编译器显示相同的错误......

3 个答案:

答案 0 :(得分:1)

std::make_pair<double,Item>的第二个参数是Item而不是double。我想你想改用std::bind1st

答案 1 :(得分:1)

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) ) );

编辑:对于MS VS,我将make_pair定义如下:

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) ) );

答案 2 :(得分:1)

您不应该使用已弃用的活页夹,因为它们只会使用 在你碰到基本上的东西之前带你走几米 无法解决(具有多个参数的成员函数,更多 超过2个参数,未知的返回类型)并且它们是不兼容的 C ++ 11 lambdas。对于某种程度的前向兼容性使用 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编译。我没有 想出了原因。但是把它作为一个很好的例子,为什么你不应该 使用已弃用的活页夹!