将项目升级到Visual Studio 2012后,我遇到了调用std :: transform的问题。因为它是大型代码库的一部分,所以我简化了以下代码:
#include <complex>
#include <vector>
#include <algorithm>
template <typename Real>
std::vector<std::complex<Real>> createVector(int n) {
std::vector<std::complex<Real>> filter(n);
std::transform(filter.begin()+1, filter.begin()+(n-1)/2+1, filter.rbegin(), std::conj<Real>);
}
int main() {
createVector<double>(10);
}
编译时,我得到多个错误(略微缩短,全部用于相同的代码行):
Error 1 error C2780: '_OutTy *std::transform(_InIt1,_InIt1,_InTy (&)[_InSize],_OutTy (&)[_OutSize],_Fn2)' : expects 5 arguments - 4 provided
Error 2 error C2780: '_OutTy *std::transform(_InIt1,_InIt1,_InIt2,_OutTy (&)[_OutSize],_Fn2)' : expects 5 arguments - 4 provided
Error 3 error C2780: '_OutIt std::transform(_InIt1,_InIt1,_InTy (&)[_InSize],_OutIt,_Fn2)' : expects 5 arguments - 4 provided
Error 4 error C2780: '_OutIt std::transform(_InIt1,_InIt1,_InIt2,_OutIt,_Fn2)' : expects 5 arguments - 4 provided
Error 5 error C2784: '_OutTy *std::transform(_InIt,_InIt,_OutTy (&)[_OutSize],_Fn1)' : could not deduce template argument for '_OutTy (&)[_OutSize]'
Error 6 error C2914: 'std::transform' : cannot deduce template argument as function
Error 7 error C2784: '_OutIt std::transform(_InIt,_InIt,_OutIt,_Fn1)' : could not deduce template argument for '_OutIt' from 'std::reverse_iterator<_RanIt>'
我认为std :: transform执行一些模板递归创建,因为一次调用有多个错误。我也试过设置模板参数明确,但没有成功。 std :: transform有六个重载,不知怎的,我认为它试图与size
参数匹配。我只想尝试匹配VS12 algorithm
中最简单的重载:
template<class _InIt, class _OutIt, class _Fn1> inline
_OutIt transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func){...}
任何帮助?
谢谢, 欧文
答案 0 :(得分:1)
在这种情况下,Visual c ++ 2012使用C ++ 11并且std::conj
被重载。
使用static_cast
选择正确的功能。我个人更喜欢lambda:
std::transform(x, y, z, [](std::complex<Real> const& x){return std::conj(x);});
答案 1 :(得分:0)
不需要static_cast
。您可以这样使用谓词:
struct A {
complex<double> operator()( complex<double> i) const {return conj<double>(i);}
};
template <typename Real>
std::vector<std::complex<Real>> createVector(int n) {
std::vector<std::complex<Real>> filter(n);
std::transform( filter.begin(), filter.end(), filter.rbegin(), A());
return filter;
}
在带有lambda的C ++ 11中:
std::transform( filter.begin(), filter.end(), filter.rbegin(),
[](std::complex<Real> const& x){return std::conj(x);});