“错误:' - >'的基本操作数'具有非指针类型'***'”从使用迭代器从另一个类调用方法时出错

时间:2016-02-28 11:42:07

标签: c++ dictionary iterator associative-array

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

//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

2 个答案:

答案 0 :(得分:2)

迭代器是在指针之后建模的,因此您可以在它们上使用解除引用运算符*,或者在它们上使用指针到结构访问运算符->

但是,指针到结构访问操作符->已经在进行解除引用,因此您无法将两者结合使用。

要么it->display(ss) (*it).display(ss)

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

答案 1 :(得分:1)

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

it->second->display(ss);