无法调用存储在容器中的指针上的公共方法

Not able to call a public method on pointer stored in a container

本文关键字:指针 方法 调用 存储      更新时间:2023-10-16

奇怪的是,我在c++中得到以下代码的编译错误。

class A
    {
    public:
        void sayHai()
        {
            cout << "n Hai";
        }
    };
    int main(int argc, char** argv)
    {            
        vector< A* > vectorA;
        vectorA.push_back(new A());
        for (vector< A* >::iterator iter = vectorA.begin(); 
             iter != vectorA.end(); 
             ++iter)
            *iter->sayHai();
    }

在这里,我将指向类A的指针存储在一个向量中。当我尝试调用公共方法时,我得到以下编译错误。

VectorExample.cpp: In function 'int main(int, char**)':
VectorExample.cpp:30: error: request for member 'sayHai' in 
    '* iter.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator-> 
    [with _Iterator = A**, _Container = std::vector<A*, 
    std::allocator<A*> >]()', which is of non-class type 'A*'

有人遇到过这样的情况吗?为什么将此视为编译错误?解决这一问题的必要途径是什么?

我用g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)
编译了上面的代码

可能只是操作符优先级。错误消息看起来像是试图调用迭代器的sayHai方法。所以这样做:

(*iter)->sayHai();

此错误是由于操作符*的优先级低于操作符->。

*iter->sayHai();

将被视为*(iter->sayHai());,也就是说,你所写的等同于*( (*iter).sayHi() ) // iter->sayHi equivalent to (*iter).sayHi()由于iter类型中没有名为sayHi的成员,因此编译失败。

相反,将有问题的行替换为:(*iter)->sayHai();这将首先解引用iter,然后按预期在结果指针引用的对象上调用sayHi。