Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > неоднозначность при переопределении operator<<()


Автор: boostcoder 29.7.2010, 00:23
доброго времени суток.

при попытке переопределить operator<<() для потока:
Код

#include <iostream>

std::ostream& operator<< (std::ostream& o, int v) {
   return o;
}

int main() {
   int v = 0;
   return (std::cout << v << std::endl).good();
}


получаю сообщение:
Цитата

bb988fcf420c7ec16e3e2192ff27cfa2/source.cpp: In function 'int main()':
bb988fcf420c7ec16e3e2192ff27cfa2/source.cpp:9:25: error: ambiguous overload for 'operator<<' in 'std::cout << v'
/usr/local/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/ostream:108:7: note: candidates are: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] <near match>
/usr/local/lib/gcc/i686-pc-linux-gnu/4.5.0/../../../../include/c++/4.5.0/ostream:117:7: note:                 std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ios_type& (*)(std::basic_ostream<_CharT, _Traits>::__ios_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>, std::basic_ostream<_CharT, _Traits>::__ios_type = std::basic_ios<char>] <near match>

и т.д..

причину понимаю. но как побороть?

Автор: djamshud 29.7.2010, 02:01
Код

   int v = 0;
   operator<<(std::cout,v);


ostream::operator<<(int) уже определен, вы добавляете operator<<(ostream,int), - при вызове неопределенность. Поэтому, как я думаю, только явное указание, какой оператор использовать.

Автор: boostcoder 29.7.2010, 02:32
Цитата(djamshud @  29.7.2010,  02:01 Найти цитируемый пост)
ostream::operator<<(int) уже определен, вы добавляете operator<<(ostream,int), - при вызове неопределенность. Поэтому, как я думаю, только явное указание

это я знаю. предполагал что есть какой-то "нормальный" способ.

Автор: Abyx 29.7.2010, 08:10
никак не побороть

Автор: bsa 29.7.2010, 10:05
думаю, так можно:
Код
return ::operator<<(std::cout, v) << std::endl;
 smile 

Автор: djamshud 29.7.2010, 10:54
bsa, это было мое предложение. Ай-я-яй, как нехорошо.

:)

Автор: boostcoder 29.7.2010, 10:58
Цитата(djamshud @ 29.7.2010,  02:01)
Код

   int v = 0;
   operator<<(std::cout,v);


ostream::operator<<(int) уже определен, вы добавляете operator<<(ostream,int), - при вызове неопределенность. Поэтому, как я думаю, только явное указание, какой оператор использовать.

наверное, в таком случае, лучше использовать функцию smile

Добавлено через 19 секунд
вопрос закрыт.
всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)