개발자
template<typename E > class Node { public: Node() : next(nullptr), prev(nullptr) {} bool operator<(Node N) { return N.data < data; } bool operator>(Node N) { return N.data > data; } template<typename E> friend ostream& operator<<(ostream& os, const Node<E>& N) { os << N.data; return os; } private: E data; Node<E>* next; Node<E>* prev; friend class LinkedList<E>; }; 다른print 함수{cout<<Node객체.data} 이렇게 E타입의 data를 <<로 출력해야 하는데 [ C2679 이항 '<<': 오른쪽 피연산자로 'const E' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다. ] 자꾸 위와 같은 오류가 뜹니다... 그래서 template<typename E>를 연산자 오버로딩 앞에 붙여봐도 [ C2995 'std::ostream &operator <<(std::ostream &,const Node<E> &)': 함수 템플릿이 이미 정의되었습니다. ] 이런 오류가 발생하구요. 템플릿 타입을 <<로 어떻게 출력하나요??
답변 0
첫 답변을 기다리고 있어요.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 04월 08일
로 사용자가 정의한 타입 `E`에 대해 `<<` 연산자를 이용해서 출력하려면, 해당 타입에 대한 `<<` 연산자가 오버로드되어 있어야 합니다. 예를 들어, 로 사용자가 정의한 클래스인 경우 다음과 같이 `<<`를 오버로드할 수 있습니다: ``` class MyClass { public: friend ostream& operator<<(ostream& os, const MyClass& myClass){ os << myClass.myData; return os; } private: int myData; }; ``` 그러나 위와 같은 방법은 템플릿 클래스인 경우 적합하지 않을 수 있습니다. 일반적으로 C++에서는 기본 데이터 타입(예: int, float 등)에 대해 `ostream`의 `<<` 연산이 이미 정의되어 있으므로 이를 사용하려면 해당 데이터 타입에 맞게 출력을 처리해주어야 합니다. `Node<E>` 클래스에서 E타입의 data를 출력하도록 좋은 방법은 Node 클래스에 멤버 함수를 추가하여 data 값에 접근하는 것입니다. 예시 코드는 아래와 같습니다: ```cpp template<typename E > class Node { public: E getData() const {return data;} // Rest of your class }; template <typename T> std::ostream& operator<<(std::ostream& os, const Node<T>& node) { return os << node.getData(); } ``` 위 코드처럼 해서 std::ostream 객체와 Node 객체 사이에 `<<` 연산자를 오버로드하면 Node 객체의 data 값을 출력할 수 있습니다. 그러나 이 방법은 E가 정의된 `<<` 연산자를 가질 경우에만 작동합니다. 만약 E가 사용자 지정 타입이고 해당 사용자 지정 타입이 `<<` 연산을 정의하지 않았다면, 여전히 동일한 문제가 발생할 수 있습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!