#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 .