Calling VS12 std::transform?
Calling VS12 std::transform?
在将一个项目升级到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);});
相关文章:
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- std::transform 将一个结构数组复制到另一个结构数组
- 如何正确使用 std::transform 和 std::mem_fn?
- 如何在 std::transform 中使用 std::p ow 作为一元函数?
- 将 std::transform 与 std::back_inserter 一起使用是否有效?
- 使用 std::transform 最终向量保持为空
- C++ 通过 std::transform 的 vector 索引获取向量
- 使用 std::transform 在 2d C 阵列上转换为 1d C 数组
- std::transform 可以替换为 std::累积吗?
- 使用 std ::transform 构造 std::vector.返回未命名结果的可能性?
- std::transform C++ 上的致命错误
- std::transform 操作到 --end() 和奇怪的输出
- 在 lambda(parameter) 中为 std::transform with std::sregex_token
- 如何使用 std::transform with container without push_back.
- std::transform with std::reference_wrapper
- std::transform 或 std::generate 在没有 ExecutionPolicy 的情况下是否可以并
- 如何使用for_each,transform,Iterator和lambda的某种组合将STD ::集合的字符串转换为小
- std::transform的最后一个参数
- 在 std::for_each 和 std::transform 中正确使用函子