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で開発しています)。

エラー C2804: バイナリ'operator <<'にはパラメーターが多すぎます
エラー 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

また、b<< 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

私はあなたの2番目の解決策に行きました。

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;**
于 2011-02-15T13:09:18.827 に答える