Как исправить ошибку «неоднозначная перегрузка» при перегрузке оператора << (шаблонный)? - PullRequest
3 голосов
/ 16 октября 2011

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

ошибка: неоднозначная перегрузка для оператора «оператор <<» в std :: cout << «Тест»'</p>

.. Далее следуют 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;
    }

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

Ответы [ 3 ]

6 голосов
/ 16 октября 2011

Ваша функция имеет ту же подпись, что и уже определенная.Вот почему компилятор жалуется на неоднозначную перегрузку.Ваша функция пытается определить функцию для потоковой передачи всего в 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;
}
2 голосов
/ 16 октября 2011

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

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;
}
0 голосов
/ 16 октября 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.

...