调用VS12 std :: transform?

时间:2014-03-20 22:55:17

标签: c++ c++11

将项目升级到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){...}

任何帮助?

谢谢, 欧文

2 个答案:

答案 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;
}

compiled example

在带有lambda的C ++ 11中:

std::transform( filter.begin(), filter.end(), filter.rbegin(), 
                     [](std::complex<Real> const& x){return std::conj(x);});