2012-04-28 7 views
1

클래스 개체를 매트릭스 형식으로 보려면 삽입 연산자를 오버로드해야합니다. 나는 코드를 작성했지만 잘못된 것이있다. 이것을 내 코드에 포함시키고 빌드하려고하면 컴파일러가 나에게 많은 오류를줍니다. 그 부분을 주석 처리했을 때 오류가 사라지고 프로그램이 올바르게 작동합니다.삽입 연산자 오버로딩의 문제점은 무엇입니까? (<< 연산자)

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

그것은 그것은 클래스의 범위 밖에 기록, 클래스 Storage2D의 멤버 함수되지 않습니다 : 여기에

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

내가 주요 기능에서 과부하를 사용하려고하는 방법입니다 : 여기에 코드입니다 구현 파일의 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 개인 그래서 운영자는 해당 데이터 멤버에 액세스 할 수 있도록 친구가 될 필요가있다. ostreamstd 네임 스페이스에 있기 때문에, 내가 명시 적으로 std::ostream을 사용했다

#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); 

참고 : 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 코드를 전혀 모르고있다. –