Как исправить неоднозначную ошибку перегрузки при перегрузке оператора ‹‹ (шаблон)?

Я пытаюсь перегрузить оператор ‹‹, но получаю следующую ошибку:

ошибка: неоднозначная перегрузка для 'operator‹‹' в 'std::cout ‹‹ "Test"'

..За ним следуют 5 миллиардов других ошибок, похожих на:

c:\mingw\bin../lib/gcc/mingw32/4.5.2/include/c++/ostream:165:7: примечание: кандидатами являются: ...

Это происходит потому, что я использую cout в своем файле main.cpp.

Вот мой код:

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

Заранее благодарим за любую помощь, которую вы можете оказать.


person Joey    schedule 16.10.2011    source источник
comment
Я не совсем уверен, что вы предоставили нам достаточно кода для решения этой проблемы, но информация, которую вы нам имеете, наводит меня на вопрос: зачем operator<<(std::ostream&, const T&) нужен доступ к внутренностям BinTree<T>, если он не нужен? никогда их не использовали (или BinTree<T>)?   -  person Chris Lutz    schedule 16.10.2011


Ответы (3)


Ваша функция имеет ту же подпись, что и уже определенная. Вот почему компилятор сетует на неоднозначную перегрузку. Ваша функция пытается определить функцию для потоковой передачи всего в 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;
}
person David Feurle    schedule 16.10.2011
comment
Эм... Где именно вы нашли такую ​​функцию в стандартной библиотеке? - person AnT; 05.02.2019

Вы имеете в виду..

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;
}
person BLUEPIXY    schedule 16.10.2011

Опубликуйте больше кода, а пока посмотрите эту часть:

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

Это ничего не делает, но вызывает себя. Это рекурсивный вызов. operator<< определяется для вывода значения типа T, и когда вы пишете o<<value, он вызывает сам себя, так как тип value равен T.

Во-вторых, поскольку это шаблон функции, определение должно быть предоставлено в файле .h, а не в файле .cpp, если вы ожидаете, что ваш код будет работать при включении файла .h.

person Nawaz    schedule 16.10.2011