2011-10-05 52 views
1

奇怪的是,我在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)

+3

单词'Hai'的存在足以让我不想回答一个问题! :) –

回答

7

可能只是运算符优先级。该错误消息看起来像试图调用迭代器的sayHai方法。因此,请改为:

(*iter)->sayHai(); 
1

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

线 *iter->sayHai();

将被视为*(iter->sayHai());换句话说,你写什么就相当于 *((*iter).sayHi()) // iter->sayHi equivalent to (*iter).sayHi() 这不能编译,因为没有国际热核实验堆的类型,称为sayHi的成员。

相反,与替换行中的问题: (*iter)->sayHai(); 这将第一解引用ITER然后调用sayHi的通过所产生的指针所引用的对象上按预期方式。

相关问题