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'

问题出在哪里?谢谢你的帮助。编译器 MSVS 2010 x86。我更喜欢没有 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

的第二个参数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) ) );
于 2012-01-19T23:28:35.073 回答
1

您不应该使用已弃用的活页夹,因为它们只会带您走几米,然后才会遇到基本上无法解决的问题(具有多个参数的成员函数,超过 2 个参数,未知的返回类型)并且它们是与 C++11 lambda 不兼容。对于某种程度的前向兼容性,请使用 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 回答
1

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

于 2012-01-19T23:16:50.193 回答