【问题标题】:"error: base operand of ‘->’ has non-pointer type ‘***’" error when calling a method from another class with iterator“错误:'->' 的基操作数具有非指针类型'***'”从另一个具有迭代器的类调用方法时出错
【发布时间】:2016-06-11 11:00:48
【问题描述】:

我正在实现一种方法,该方法通过关联数组中的名称搜索Object 类型的对象。然后使用类Object 中定义的方法display 显示其元素。该方法是这样实现的:

//Method SearchObject in class Gestion
#include "object.h"
void Gestion::SearchObject(string nameobj) const{

    stringstream ss;

    auto it = objectname.find(nameobj);
    if (it == objectname.end())
        cout << "Not found!" << endl;
    else
           (*it)->display(ss); //Error reported in this line
           cout << ss.str() << endl;
}

然而,编译时出现以下错误:

error: base operand of ‘->’ has non-pointer type ‘const std::pair<const std::basic_string<char>, std::shared_ptr<Object> >’
            (*it)->display(ss);

display 方法在类Object 中声明,我已经通过从其他类调用它进行了测试。在Gestion 类的标题中,变量是这样声明的:

//File gestion.h
typedef std::shared_ptr<Object> ObjPtr;
typedef map<string, ObjPtr> Objectmap;

class Gestion { 
private:
         Objectmap objectname;
public:
    Gestion(Objectmap objectname);
    virtual ~Gestion() {}

    virtual void SearchObject(string nameobj) const; 
};

如何在我正在实施的这个新方法中使用方法display

【问题讨论】:

  • 在迭代器上使用 both -&gt;* 会尝试将您降低两个级别。根据编译器,一个太多了。

标签: c++ dictionary iterator associative-array


【解决方案1】:

看起来 Objmultomedia 是 std::pair。您需要从 pair 的第二个元素调用 display

it->second->display(ss);

【讨论】:

    【解决方案2】:

    迭代器是根据指针建模的,因此您可以在它们上使用解引用运算符*,或在它们上使用指向结构访问运算符-&gt;

    但是,指向结构的访问运算符 -&gt; 已经在进行取消引用,因此您不能将两者结合起来。

    it-&gt;display(ss)(*it).display(ss)


    这是个谎言,因为迭代器“指向”std::pair,其second 成员是一个指针,所以你应该使用*-&gt; 取消引用,例如it-&gt;second-&gt;display(ss)(*it).second-&gt;display(ss),或(*it-&gt;second).display(ss)(*(*it).second).display(ss)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多