Calling VS12 std::transform?

Calling VS12 std::transform?

本文关键字:transform std VS12 Calling      更新时间:2023-10-16

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

帮忙吗?

谢谢,Erwin

Visual c++ 2012使用c++ 11,在这种情况下std::conj是重载的。使用static_cast选择合适的功能。我个人更喜欢lambda:

std::transform(x, y, z, [](std::complex<Real> const& x){return std::conj(x);});

不需要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;
}

编制示例

在c++ 11中使用lambda:

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