3

내가 < < 연산자를 오버로드하는 것을 시도하고있다, 그러나 나는 다음과 같은 오류 얻을 :연산자 << (템플릿)을 오버로딩 할 때 "모호한 오버로드"오류를 수정하려면 어떻게해야합니까?

error: ambiguous overload for 'operator<<' in 'std::cout << "Test "'

과 비슷한 50 억 기타 오류로 ..Followed을 : 나는 '때문에

c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/ostream:165:7: note: candidates are: ...

이 온다 내 main.cpp 파일에서 cout을 사용합니다.

BinTree.h에서 :

template <typename T> 
    class BinTree{ 
    ... 
    friend std::ostream& operator<< <>(std::ostream&, const T&); 

BinTree.cpp에서 : 당신이 줄 수있는 모든 도움에 미리

template <typename T> 
    std::ostream& operator<< (std:: ostream& o, const T& value){ 
     return o << value; 
    } 

감사

여기 내 코드입니다.

+1

나는이 문제를 해결하기 위해 충분한 코드와 함께 우리를 제공했지만, 당신이 우리에게 주신 _have_ [정보 물어 날 리드 것을 완전히 확신 아니에요 .. 찾으 셨나요? 왜'operator << (std :: ostream &, const T &)'는'BinTree '의 내부를 사용하지 않는다면 접근 할 필요가 있습니까? (또는'BinTree ')? –

답변

4

함수에 이미 정의 된 것과 동일한 서명이 있습니다. 이것이 컴파일러가 모호한 과부하에 대해 암시하는 이유입니다. 함수는 모든 것을 ostream으로 스트리밍하는 함수를 정의하려고 시도합니다. 이 기능은 표준 라이브러리에 이미 있습니다.

template <typename T> 
std::ostream& operator<< (std:: ostream& o, const T& value){ 
    return o << value; 
} 

아마도 BinTree가 (모든 것에) 스트리밍되는 방식을 정의하는 함수를 작성하고 싶을 것입니다. 스트림 유형은 템플리트 화되어 있습니다. 따라서 호출을 스트림 연산자에 연결하면 구체적인 유형을 스트리밍합니다.

template <typename T, typename U> 
T& operator<< (T& o, const BinTree<U>& value){ 
    //Stream all the nodes in your tree.... 
    return o; 
} 
0

후 더 많은 코드,이 부분을 볼 때까지이 자체를 호출을 제외한 아무것도하지 않고있다

template <typename T> 
std::ostream& operator<< (std:: ostream& o, const T& value){ 
    return o << value; 
} 

합니다. 재귀 호출입니다. operator<<T 유형의 값을 출력하도록 정의되었으며 o<<value 유형을 쓰면 value 유형이 T이므로 자체를 호출합니다. 이 기능 템플릿이기 때문에 당신이 당신의 코드가 .h 파일을 포함하여 작업을 기대한다면

둘째는, 정의는하지 .cpp 파일에서 .h 파일에 제공되어야한다.

2

당신은

template<class T> 
ostream& operator<<(ostream& os, const BinTree<T>& v){ 
    typename BinTree<T>::iterator it; 
    for(it = v.begin(); it != v.end(); ++it){ 
       os << *it << endl; 
    } 
    return os; 
}