如果我执行此代码:
function openerp_pos_models(instance, module){ //module is instance.point_of_sale
var QWeb = instance.web.qweb;
var _t = instance.web._t;
var round_di = instance.web.round_decimals;
var round_pr = instance.web.round_precision
module.PosModel = module.PosModel.extend({
"Here is the same is in the original file, except for the following line"
{
model: 'res.partner',
fields: ['name','street','city','state_id','country_id','vat','phone','zip','mobile','email','ean13','write_date','MY_NEW_FIELD'],
domain: [['customer','=',true]],
loaded: function(self,partners){
self.partners = partners;
self.db.add_partners(partners);
},
},
然后编译器给出了以下错误:
vector<complex<double> >
idft( vector<complex<double> > * v)
{
for_each(v->begin(), v->end(), conj);
如果我只为一个元素应用conj(),那么它可以正常工作:
dft.cpp: In function 'std::vector<std::complex<double>, std::allocator<std::complex<double> > > idft(std::vector<std::complex<double>, std::allocator<std::complex<double> > >*)':
dft.cpp:38: error: no matching function for call to 'for_each(__gnu_cxx::__normal_iterator<std::complex<double>*, std::vector<std::complex<double>, std::allocator<std::complex<double> > > >, __gnu_cxx::__normal_iterator<std::complex<double>*, std::vector<std::complex<double>, std::allocator<std::complex<double> > > >, <unresolved overloaded function type>)'
如何在不使用循环的情况下对整个向量应用conj()?
答案 0 :(得分:4)
for_each
在现代(C ++ 11及更高版本)C ++中很少是一个好主意。
void idft( std::vector<std::complex<double> >& v)
{
for (auto& x : v)
x = std::conj(x);
}
甚至:
template<class Range>
void idft( Range& v)
{
for (auto& x : v)
x = std::conj(x);
}
干净,通用,正确且易于阅读。
答案 1 :(得分:4)
for_each
选择的答案(现在已更改) 绝对 错误。您无法使用for_each
,因为它不会修改您正在迭代的对象。以下是使用std::transform
和简单lambda函数的方法。
std::transform(v->begin(),v->end(), v->begin(), [](const std::complex<double>& c) -> std::complex<double> { return std::conj(c); });
答案 2 :(得分:0)
因为std::conj
有多个模板函数重载,编译器不知道应该根据函数名选择哪一个。
template< class T > complex<T> conj( const complex<T>& z ); (1) template< class DoubleOrIngeter > std::complex<double> conj( DoubleOrInteger z ); (3) (since C++11)
你可以
typedef complex<double> (*CONJ_TYPE)( const complex<double>& z );
for_each(v->begin(), v->end(), static_cast<CONJ_TYPE>(conj<double>));
答案 3 :(得分:0)
如果你的函数(conj)没有修改它的输入arg,则使用std :: transform。