4

我希望得到一些帮助来解决我遇到的错误 - 我已经搜索了类似的问题,这些问题并没有真正给我我想要的东西。下面列出了一个代码片段:

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;
  }

我有一个包含许多字符串的列表框 - 这些可能因所选的其他下拉框而异。我想要这个框中的内容到文件以及用户从填充它的下拉列表中选择的内容。但是我收到以下错误(我正在 VS 2008 中开发)。

error C2804: binary 'operator <<'has too many parameters
error C2333: 'NewSelectionDlg::operator <<': 函数声明错误;跳过函数体

我不知道为什么我相信重载运算符的语法是可以的 - 任何人都可以看到我做的愚蠢或可能错过的任何事情 - 非常感谢任何帮助。

4

6 回答 6

5

只需在类定义之外定义它或在声明友谊时在子类中定义它:

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
}; 
于 2011-02-15T12:08:35.807 回答
3

operator <<不能是成员函数。第一个参数必须是std::ostream; 在您的代码中,第一个(隐式)参数是this指针,即 type 的对象NewSelectionDlg*

您需要改为operator <<作为免费功能实现。

于 2011-02-15T12:08:50.067 回答
1

您应该相应地在定义和范围operator<<之外定义重载。NewSelectionDlgCProductListBox

ostream& operator<<(ostream& o, const NewSelectionDlg::CProductListBox& b)
{
    ...
}
于 2011-02-15T12:08:43.007 回答
0

另外,它应该是<< 中的ab而不是 an :o

    std::cout << o.m_lstEclispeProducts;
于 2011-02-15T12:10:39.290 回答
0

使用声明时:

朋友 void foo();

您正在做的是在封闭的命名空间范围内声明一个函数。

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

运营商也是如此。

于 2011-02-15T13:45:33.740 回答
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' : is not a member of '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;**
于 2011-02-15T13:09:18.827 回答