2012-04-28 15 views
1

クラスオブジェクトを行列形式で表示するには、挿入演算子をオーバーロードする必要があります。私はコードを書いたが、何か間違っている。これを私のコードに組み込み、ビルドしようとすると、コンパイラは私に多大なエラーを与えます。その部分をコメントアウトすると、エラーはなくなり、プログラムは正しく動作します。ここでは、コードは次のようになります。ここでは挿入演算子のオーバーロードにはどのような問題がありますか? (<<演算子)

template <class itemType> 
ostream & operator<< (ostream & os, const Storage2D<itemType> & rhs) 
{ 
    node<itemType>* ptrRow = rhs.head; 
    node<itemType>* ptrColumn = rhs.head; 
    for(; ptrColumn->down != NULL; ptrColumn = ptrColumn->down) 
    { 
     ptrRow = ptrColumn; 
     for(; ptrRow->right != NULL; ptrRow = ptrRow->right) 
     { 
      os << ptrRow->info << setw(10); 
     } 
     os << ptrRow->info << setw(10) << endl; 
    } 

    return os; 
} 

は、私は、main関数からのオーバーロードを使用しようとした方法である:

Storage2D<double> m(row, column); 
cout << m; 

それはそれは、クラスのスコープの外に書かれている、クラスStorage2Dのメンバ関数ではありません実装ファイルのStorage2D。

あなたが私を助けてくれたら、前もって感謝します。

編集:ここに私のコードの残りの部分があります。 Storage2D.hファイル:

template <class itemType> 
struct node 
{ 
    itemType info; 
    node* right; 
    node* down; 

    node() 
    {} 

    node(itemType data, node* r = NULL, node* d = NULL) 
    { 
     info = data; 
     right = r; 
     down = d; 
    } 
}; 

template <class itemType> 
class Storage2D 
{ 
public: 
    Storage2D(const int & , const int &);  //constructor 
    //~Storage2D();        //destructor 
    //Storage2D(const Storage2D &);    //deep copy constructor 

private: 
    node<itemType>* head; 
}; 

ostream& operator<< (ostream & os, const Storage2D & rhs); 

#include "Storage2D.cpp" 
+3

エラーメッセージが表示されます。理想的には、問題を示す小さな(100行未満の)自己完結型のテストケースも表示します。あなたが示したコードは何が間違っているかを知るには不十分です。 – zwol

+2

原則として、「私がXを行うとエラーが出る」という性質の問題を解決する方法を尋ねるときは、少なくともそのエラーの最初のコピーを質問に含めるべきです。 –

+0

あなたはオペレーターを友人にする必要がありますが、確かめるためにはエラーが必要です。 – 111111

答えて

2

headはプライベートですので、オペレータは、そのデータメンバにアクセスできるように友人になる必要があります。

#include <iostream> // for std::ostream 

template <class itemType> 
class storage2D { 
// as before 
template <typename T> 
friend std::ostream& operator<< (std::ostream & os, const Storage2D<T> & rhs); 
}; 

// declaration 
template <typename T> 
std::ostream& operator<< (std::ostream & os, const Storage2D<T> & rhs); 

ostreamstd名前空間にあるので、私は、std::ostreamを明示的に使用していること:Storage2Dはクラステンプレートであるので、それはまた、関数テンプレートとして宣言する必要があります。

+0

この修正により多くのエラーが発生しましたが、引き続きエラーは4です。私はostream&return型として認識しないと思います。それを使用するライブラリをいくつか含める必要がありますか?

 syntax error : missing ';' before '&' \t syntax error : missing ';' before '' \t missing type specifier - int assumed. Note: C++ does not support default-int missing type specifier - int assumed. Note: C++ does not support default-int All for this line: ostream& operator<< (ostream & os, const Storage2D & rhs);

+0

@MertToka が含まれていない可能性があり、おそらく 'std'名前空間を使用する必要があります。私は私の答えを編集しました。 – juanchopanza

+0

ありがとうございました。 Btw、私の命令の悪い編集のために残念です。私はHTMLコードに全く見知らぬ人です。 –

関連する問題