Как мне исправить ошибку «неоднозначной перегрузки» при перегрузке operator<< (шаблонный)?

#c #templates #compiler-errors #overloading #operator-keyword

#c #шаблоны #ошибки компилятора #перегрузка #operator-ключевое слово

Вопрос:

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

ошибка: неоднозначная перегрузка для ‘operator<<‘ в ‘std::cout << «Test «‘

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

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

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

Вот мой код:

В BinTree.h:

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

В BinTree.cpp:

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

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

Комментарии:

1. Я не совсем уверен, что вы предоставили нам достаточно кода для решения этой проблемы, но информация , которую вы нам предоставили, заставляет меня спросить: зачем operator<<(std::ostreamamp;, const Tamp;) нужен доступ к BinTree<T> внутренним компонентам, если он никогда не использует их (или BinTree<T> )?

Ответ №1:

Ваша функция имеет ту же подпись, что и уже определенная. Вот почему компилятор жалуется на неоднозначную перегрузку. Ваша функция пытается определить функцию для потоковой передачи всего в ostream. Эта функция уже существует в библиотеке стандартов.

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

Возможно, вы хотите написать функцию, которая определяет, как передается потоковое двоичное дерево (для всего). Пожалуйста, обратите внимание, что тип потока является шаблонным. Итак, если вы связываете вызовы с оператором потока, он передает конкретный тип.

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

Комментарии:

1. Um… Где именно вы нашли такую функцию в стандартной библиотеке?

Ответ №2:

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

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

Ответ №3:

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

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

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

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