2016-03-15 61 views
-1

我有一個關於超載<<運算符的問題。重載<<運算符不起作用

我有一個名爲House類中,我已經定義如下(我沒有宣佈它作爲friend,這是一個免費的「功能」,因爲我不打算訪問私有成員):

std::ostream& operator<<(std::ostream& stream, House const& house) 
{ 
    // Append strings to 'stream' 
    return stream 
} 

在另一類,我有這樣的:

std::vector<std::unique_ptr<House>> houses 

現在,我想通過我的vector迭代並顯示房屋,我有2個問題!

我的第一個問題:有沒有辦法使用foreach循環通過我vectorunique_ptr的迭代,因爲它似乎並不認爲我可以這樣做:for (auto house : houses) { /* Do stuff */ }

第二個問題:如果我重複使用正常for循環,我這樣做:

for (int i = 0; i < houses.size(); i++) 
{ 
    cout << *houses[i].get() << endl; 
} 

我收到一個錯誤,指出沒有運營商< <操作數匹配。你能告訴我我錯過了什麼嗎?

更新

謝謝大家對你的答案,使用auto&迭代幫了不少忙,和我的其他問題的原因是,我是在定義我的House.cpp文件我的重載運算符。由於我在爲House.h執行#include,因此無法看到重載的操作員。愚蠢的錯誤!

+0

一個問題吧。 –

+2

請發表[MCVE]而不是僞代碼,否則您的問題無法收到簡明的答案。 –

+0

'(自動&房屋:房屋)' – 0x499602D2

回答

2

通過迭代的unique_ptr矢量:

for (auto& phouse : houses) { // phouse is a referetence to a unique_ptr 
    /* Do stuff using *p or p->xxx */ 
} 

備註:用auto&訣竅意味着環路將使用(通過引用)中的指針中的載體中。只有auto,編譯器會嘗試將unique_ptr複製到循環變量中,unique_ptr被禁止。

我無法重現您的第二個問題的錯誤。至少在添加缺失的;之後不會。順便說一句,你不需要get():您可以立即解除引用

這裏每個問題的online demo