Недавно я потратил довольно много времени на понимание сообщения об ошибке при вызове func()
в этом фрагменте кода:
int main()
{
vector< vector<double> > v;
double sum = 0;
for_each( v.begin(), v.end(),
bind2nd( ptr_fun(func), &sum ) );
return 0;
}
когда func()
было объявлено так, код компилировался нормально:
void func( vector<double> v, double *sum )
{
}
когда я использовал это объявление (для эффективности), я получил ошибку компилятора:
void func( const vector<double> &v, double *sum )
{
}
Ошибка, которую я ожидал увидеть, была чем-то вроде ошибки ссылки на ссылку из-за определения operator() в binder2nd,
result_type operator()(const argument_type& _Left) const
Вместо этого, к моему удивлению, компилятор Visual C++ (VS2012) выдал следующую ошибку:
ошибка C2535: 'void std::binder2nd‹_Fn2>::operator ()(const std::vector‹_Ty> &) const': функция-член уже определена или объявлена
который я не могу расшифровать.
- Можете ли вы объяснить, по какому механизму
operator()
уже определено?
Полная ошибка, которую я получил, была:
error C2535: 'void std::binder2nd<_Fn2>::operator ()(const std::vector<_Ty> &) const' : member function already defined or declared
with
[
_Fn2=std::pointer_to_binary_function<const std::vector<double> &,double *,void,void (__cdecl *)(const std::vector<double> &,double *)>,
_Ty=double
]
c:\vc\include\xfunctional(319) : see declaration of 'std::binder2nd<_Fn2>::operator ()'
with
[
_Fn2=std::pointer_to_binary_function<const std::vector<double> &,double *,void,void (__cdecl *)(const std::vector<double> &,double *)>
]
c:\consoleapplication1.cpp(31) : see reference to class template instantiation 'std::binder2nd<_Fn2>' being compiled
with
[
_Fn2=std::pointer_to_binary_function<const std::vector<double> &,double *,void,void (__cdecl *)(const std::vector<double> &,double *)>
]
Build FAILED.
std::bind
, чтобы избежать этих устаревших вещей. - person kennytm   schedule 10.09.2012