【问题标题】:error C2064: term does not evaluate to a function taking 0 arguments错误 C2064:术语不计算为采用 0 个参数的函数
【发布时间】:2011-09-27 12:23:11
【问题描述】:

大家! 我在地图容器中维护一组通道数据,可以通过其通道名称访问单个通道数据。关于这个,我写了一个简单的函数GetIRChannelData(请看下面的代码)。编译时,pusIRChannelData = cit->second(); 语句抛出错误,内容为

error C2064: term does not evaluate to a function taking 0 arguments

要做的所有功能就是在地图容器中搜索给定的频道名称/ID,如果找到,则将其数据指针分配给时间指针。你能告诉我有什么问题吗?

const Array2D<unsigned short>* GetIRChannelData(std::string sChannelName) const
{   
    const Array2D<unsigned short>* pusIRChannelData = NULL;

    for (std::map<std::string, Array2D<unsigned short>* >::const_iterator cit =    m_usIRDataPool.begin(); cit != m_usIRDataPool.end(); ++cit) 
    {   
        std::string sKey = cit->first; 

        if (sKey == sChannelName)
        {   
           pusIRChannelData = cit->second(); // Error occurred on this line
           break;
        }
    }

    return pusIRChannelData;
}

【问题讨论】:

  • 有什么特殊原因你不使用std::mapfind 方法而不是循环遍历所有元素来寻找密钥?
  • 附带说明,类型别名确实有助于使代码更具可读性:typedef std::map&lt;...&gt; DataPool; for (DataPool::const_iterator ...

标签: c++ pointers map


【解决方案1】:

错误信息很清楚......你调用了一个不存在的函数。 map::iterator 指向一个std::pair,它有两个成员对象firstsecond。请注意,这些不是函数。从有问题的行中删除(),错误应该会消失。

【讨论】:

  • 这是一个 std::map 迭代器,不是吗? first是key,声明为std::stringsecond是value。
  • @geekosaur:是的,我最初误读了循环,以为他在迭代地图的值类型。现在应该是正确的。
  • 谢谢你,丹尼斯。我犯了这么低级的错误!
  • 值得注意的是,std::pair 仅在这种特殊情况下不包含函数指针或函子。考虑例如std::map&lt;std::string, void (*)()&gt;.
  • 不,错误信息是模糊的,尤其是对于新手。一个明确的信息应该是“std::pair has no function 'second()'。你的意思是成员变量'second'吗?”
【解决方案2】:

看起来cit-&gt;second 没有识别函数指针。迭代器的定义声称它是指向(Array2D&lt;unsigned short&gt;) 的指针; pusIRChannelData 是一个(Array2D *),所以你可能想要cit-&gt;second 而不是cit-&gt;second()(它试图调用你的(Array2D *) 作为一个函数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多