2011-02-15 114 views
4

我希望得到一些幫助,我得到一個錯誤 - 我已經搜索了類似的問題,沒有真正給我以後的東西。一個代碼片段如下:C++重載<< error

class NewSelectionDlg : public CDialog 
{ 
// Construction 
public: 

    class CProductListBox 
    { 
    public: 
    friend ostream& operator <<(ostream& o, const CProductListBox& b); 
    }; 
    ostream& operator<<(ostream& o, const CProductListBox& b) 
    { 
     std::cout << o.m_lstEclispeProducts; 
     return o; 
    } 

我有一個包含若干字符串列表框 - 這些都取決於其他下拉選擇框會有所不同。我想要將這個框中的內容添加到文件中,以及用戶從下拉列表中選擇哪些內容以使其突出顯示。 Howvever我收到以下錯誤(我在VS 2008中開發)。

錯誤C2804:二進制'operator <<'參數太多
錯誤C2333:'NewSelectionDlg::operator <<':函數聲明中的錯誤;跳過函數體

我不知道爲什麼,因爲我相信的超載運營商的語法是OK - 任何人都可以看到什麼我已經做了愚蠢的或可能已經錯過了 - 任何幫助非常感謝。

回答

5

只是把它定義類定義之外或在子類中定義它宣稱的友誼時:的NewSelectionDlg的定義和範圍CProductListBox相應之外

class NewSelectionDlg : public CDialog 
{ 
// Construction 
public: 

    class CProductListBox 
    { 
    public: 
    friend ostream& operator <<(ostream& o, const CProductListBox& b); 
    }; 

// (...) Rest of NewSelectionDlg 
}; 

ostream& operator <<(ostream& o, const NewSelectionDlg::CProductListBox& b) 
{ 
    // Did you meant: 
    return o << b.m_lstEclispeProducts; 
} 

class NewSelectionDlg : public CDialog 
{ 
// Construction 
public: 

    class CProductListBox 
    { 
    public: 
    friend ostream& operator <<(ostream& o, const CProductListBox& b) 
    { 
     // Did you meant: 
     return o << b.m_lstEclispeProducts; 
    } 
    }; 

// (...) Rest of NewSelectionDlg 
}; 
+0

嗨帕維爾 - 感謝您的幫助 - 我張貼了另一個查詢,如果你可以幫助 - 謝謝。 – user617702 2011-02-15 13:10:00

+0

如果您接受我的答案,我將不勝感激。 – 2011-02-15 13:13:25

1

你應該定義重載operator<<

ostream& operator<<(ostream& o, const NewSelectionDlg::CProductListBox& b) 
{ 
    ... 
} 
+0

非常感謝所有的建議專家 - 我會通過這些工作,讓你知道結果。 – user617702 2011-02-15 12:53:45

3

operator <<不得是成員函數。第一個參數必須是std::ostream;在您的代碼中,第一個(隱含)參數是this指針,即NewSelectionDlg*類型的對象。

您需要實現operator <<作爲一個免費函數。

0

而且,它應該是一個b而非o在< <:

std::cout << o.m_lstEclispeProducts; 
0

我與你的第二個解決方案去了。

class NewSelectionDlg : public CDialog 
{ 
// Construction 
public: 

    class CProductListBox 
    { 
    public: 
    friend ostream& operator <<(ostream& o, const CProductListBox& b) 
    { 

     return o << b.m_lstEclispeProducts; 
    } 
    }; 

我仍然得到一個錯誤 - 錯誤C2039:「m_lstEclispeProducts」:是不是成員「NewSelectionDlg :: CProductListBox」

我不知道爲什麼這是因爲NewSelectionDlg的一部分類包含此代碼(相關的行粗體) - 如果您有任何進一步的幫助/建議,這將是一個很大的幫助。由於

// Dialog Data 

//{{AFX_DATA(NewSelectionDlg) 

    enum { IDD = IDD_NEW_SELECTION }; 

    CButton m_btnMessageBoard; 

    CButton m_btnMoreInfo; 

    CComboBox m_cmbOpenDocuments; 

    CButton m_btnOk; 

    CButton m_btnStateApprovals; 

    CComboBox m_cmbProductType; 

/// CListBox m_lstSalesConcepts; 

    CButton m_chkObjectiveWizard; 

    **CProductListBox m_lstEclipseProducts;** 
+0

這是因爲你`m_lstEclispeProducts`是`NewSelectionDlg`的成員,而不是`NewSelectionDlg :: CProductListBox`。你如何使用這段代碼?考慮添加一個變量到`NewSelectionDlg :: CProductListBox`存儲你想打印的對象的`m_lstEclispeProducts`。 – 2011-02-15 13:20:48

0

當您使用聲明:

朋友無效美孚();

你在做什麼是在封閉的命名空間範圍內聲明一個函數。

namespace name { 
    struct outer { 
     struct inner { 
     friend void foo(); // declares name::foo 
     }; 
    }; 
    void foo() {} // defines it 
} 

運營商也是如此。