我是靠谱客的博主 拼搏百合,最近开发中收集的这篇文章主要介绍c++ error 2064: term does not evaluate to a function taking 1 arguments解决方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先来看一个简单的示例:
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);
        });

最后

以上就是拼搏百合为你收集整理的c++ error 2064: term does not evaluate to a function taking 1 arguments解决方法的全部内容,希望文章能够帮你解决c++ error 2064: term does not evaluate to a function taking 1 arguments解决方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部