c++ error 2064: term does not evaluate to a function taking 1 arguments解决方法

2023-05-16

首先来看一个简单的示例:
class T
{
public:
    T() = default;
    ~T() = default;

    int convertToInt(double x)
    {
        return ceil(x);
    }

    void doSomething()
    {
        vector<double> vecD{ 2.5, 3.0, 4.9 };
        vector<int> vecI;
        std::transform(vecD.begin(), vecD.end(), std::back_inserter(vecI), mem_fn(&T::convertToInt));
    }
};

这个端代码编译时会报错“ c++  error 2064: term does not evaluate to a function taking 1 arguments”,这个错误是在哪条语句报出来的呢?是在tranform这个函数中调用的_transform方法:
template<class _InIt,
 class _OutIt,
 class _Fn1> inline
 _OutIt _Transform(_InIt _First, _InIt _Last,
  _OutIt _Dest, _Fn1 _Func)
 { // transform [_First, _Last) with _Func
 for (; _First != _Last; ++_First, ++_Dest)
  *_Dest = _Func(*_First);    //就是这一行
 return (_Dest);
 }

编译器抱怨的是“_Func这个函数不能转为接受一个参数的函数”,但以上代码使用的函数“converToInt”明明是只接受一个参数的函数,那为什么编译器还会报这个错呢?这是因为在这个例子中,mem_fn返回一个仿函数,而这个仿函数接受两个参数,一个是T*指针,第二个才是我们需要的double。所以编译器会产生这个错误。
为了解决这个错误,有以下几种方法:
1. 将transfomr那行改为:
std::transform(vecD.begin(), vecD.end(), std::back_inserter(vecI), std::bind1st(std::mem_fn(&T::convertToInt),this));

2. 将函数converToInt改为一个静态方法:
static  int convertToInt(double x) 
{
	return ceil(x);
}

这样一来,由于static方法没有this指针,所以mem_fn返回的是一个值接受一个double作为参数的仿函数。
3. C++ 11之后,使用lambda表达式
将tranform那个函数调用改为:
std::transform(vecD.begin(), vecD.end(), std::back_inserter(vecI),
            [this](double & dVal)
        {
            return this->convertToInt(dVal);
        });

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ error 2064: term does not evaluate to a function taking 1 arguments解决方法 的相关文章

随机推荐