我最近花了相當長的一段時間,這段代碼調用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)
{
}
我期望看到的錯誤是像一個參考 - 參考錯誤,因爲運營商(binder2nd的)的定義,
result_type operator()(const argument_type& _Left) const
相反,我驚訝的是, Visual C++(VS2012)編譯器給我的錯誤是:
error C2535: 'void std::binder2nd<_Fn2>::operator()(const std::vector<_Ty> &) const' : member function already defined or declared
我不能解密。
- 你能解釋下其機制
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.
由於您使用VS 2012,我認爲您可以切換到C++ 11並使用lambda/std :: bind來避免這些棄用的東西。 – kennytm
看起來像它指的是binder2nd結構的op(),由於參考摺疊(或類似的)被定義了兩次相同的簽名。 – PlasmaHH
這很有趣。看起來你不能在舊的活頁夾包裝中使用引用參數類型?! –