2011-10-05 53 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的通過所產生的指針所引用的對象上按預期方式。

相關問題