有以下数据类型:
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() ) );
但编译器显示相同的错误......
答案 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::bind1st
(bind1st
,因为您将参数绑定到。{
错误的立场,正如其他人指出的那样。)。
作为C ++ 03解决方案的额外奖励:
std::bind1st(std::ptr_fun(std::make_pair<int, Item>), int());
奇怪的是,它不能在4.6.2上用C ++ 11编译。我没有 想出了原因。但是把它作为一个很好的例子,为什么你不应该 使用已弃用的活页夹!