Форум программистов, компьютерный форум CyberForum.ru

Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' - C++

Восстановить пароль Регистрация
 
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.11.2014, 20:05     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #1
error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' and 'size_t {aka long long unsigned int}')|
на
C++
1
#define LOG(Variable) Log<<"<"; Log<<StripXML(#Variable)<<">"<<std::endl<<"<Bits>x"<<std::dec<<std::noshowbase<<8*sizeof(Variable)<<std::hex<<std::showbase<<"</Bits>"<<std::endl<<"<Line>"<<std::dec<<std::noshowbase<<__LINE__<<std::hex<<std::showbase<<"</Line>"<<std::endl<<"<Adress>"<<(void*)&Variable<<"</Adress>"<<std::endl<<"<Value>"; Log<<Variable<<"</Value>"<<std::endl<<"</"; Log<<StripXML(#Variable)<<">"<<std::endl
. Как исправить?

Добавлено через 1 час 13 минут
Проблема решена, но не понята:
C++
1
#define LOG(Variable) Log<<"<"; Log<<StripXML(#Variable)<<">"<<std::endl<<"<Bits>x"<<std::dec<<std::noshowbase<<8*sizeof(Variable)<<std::hex<<std::showbase<<"</Bits>"<<std::endl<<"<Line>"<<std::dec<<std::noshowbase<<__LINE__<<std::hex<<std::showbase<<"</Line>"<<std::endl<<"<Adress>"<<(void*)&Variable<<"</Adress>"<<std::endl<<"<Value>"; Log<<Variable; Log<<"</Value>"<<std::endl<<"</"; Log<<StripXML(#Variable)<<">"<<std::endl
.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2014, 20:05     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}'
Посмотрите здесь:

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& C++
C++ ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*')
IntelliSense: отсутствует оператор "<<", соответствующий этим операндам типы операндов: std::basic_ostream<char, std::char_traits<char> C++
C:\Projects\mmz\Compile\CompileAMD64\mmzCompileAMD64\TProjec t.cpp|74|error: declaration of 'std::ofstream File' shadows C++
C++ Error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2909 / 1445 / 397
Регистрация: 18.10.2014
Сообщений: 2,663
25.11.2014, 20:27     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #2
Цитата Сообщение от taras atavin Посмотреть сообщение
Как исправить?
Не пытаться посылать на выход значения типа 'size_t'. В стандартных потоках не гарантируется наличие оператора вывода для того типа , который скрывается за 'size_t' . Хотите выводить 'size_t' - явно приводите его к конкретному стандартному целочисленному типу.

Цитата Сообщение от taras atavin Посмотреть сообщение
Проблема решена,
Никакого "решения проблемы" в этой ковровой дорожке длиной в три километра я не увидел и высматривать не собираюсь. Если вы нашли какое-то решение проблемы - описывайте его нормальным русским языком.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 05:51  [ТС]     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #3
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если вы нашли какое-то решение проблемы - описывайте его нормальным русским языком.
Я даже не понимаю, в чём проблема была.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.11.2014, 07:30     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #4
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В стандартных потоках не гарантируется наличие оператора вывода для того типа , который скрывается за 'size_t' .
Можно узнать, почему? size_t это гарантированно alias на один из фундаментальных типов. А операторы ввода/вывода вроде перегружены для всех фундаментальных типов.

Добавлено через 9 минут
taras atavin, а как Вы используете этот макрос и что за функция ( или макрос ) StripXML?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 07:37  [ТС]     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #5
Макрос выводит переменную в xml-лог, записывая её имя, адрес, значение и в какой конкретно строке программы она имеет такое значение. А функция экранирует символы &<>.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.11.2014, 07:44     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #6
Вы не перегружали operator<<? У меня оба варианта отрабатывают нормально.

Добавлено через 2 минуты
И не понятно, зачем экранировать &<>? Откуда им взяться в имени переменной?
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2909 / 1445 / 397
Регистрация: 18.10.2014
Сообщений: 2,663
26.11.2014, 07:49     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #7
Цитата Сообщение от Toshkarik Посмотреть сообщение
size_t это гарантированно alias на один из фундаментальных типов.
Как раз таки не гарантируется, что за 'size_t' скрывается стандартный тип. Это может быть и какой-то платформенно-зависимый нестандартный тип.

Например, до С++11 самым большим целым типом в С++ был 'long', который не обязан быть 64-битным, но при этом 64-битные С++ платформы (с соответственно 64-битным 'size_t') появились задолго до С++11. Понятно, что на таких платформах за 'size_t' скрывалось что-то нестандартное. На таких платформах формально не гарантируется существование потоковых операторов ввода-вывода для 'size_t'.

К примеру, можно взять тот же MS Visual Studio - С++ платформу, которая относительно давно поддерживает 64-битный код (т.е. 64-битный 'size_t'), но до относительно недавнего времени не поддерживала 'long long'.

И даже на платформах с 'long long' не гарантируется, что 'size_t' будет использовать именно его.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 08:03  [ТС]     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #8
Цитата Сообщение от Toshkarik Посмотреть сообщение
И не понятно, зачем экранировать &<>? Откуда им взяться в имени переменной?
Функция предназначена для значений, для имён я её не смог сделать. Предположим, я хочу залогировать член Name безыменного объекта по указателю Child, в браузере это должно выглядеть так:
Название: Скрин.png
Просмотров: 40

Размер: 5.8 Кб
. Или я хочу вместо этого залогировать безыменный unsigned long long int по указателю s, в браузере это должно выглядеть так:
Название: Скрин1.png
Просмотров: 40

Размер: 5.4 Кб
. Так вот, этого я пока не добился. На адрес не смотрите, он здесь с абсолютно потолочного фрагметнта лога.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 08:07  [ТС]     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
К примеру, можно взять тот же MS Visual Studio - С++ платформу, которая относительно давно поддерживает 64-битный код (т.е. 64-битный 'size_t'), но до относительно недавнего времени не поддерживала 'long long'.
Она поддерживала тип hyper.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.11.2014, 08:29     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #10
TheCalligrapher, так речь не о догадках о том, как ой именно это тип. А о том, что он является одним из фундаментальных типов для этой платформы. В gcc на x86_64 платформе, собственно, long равен 64 битам.
По Вашей логике получается, что в некоторой реализации может отсутсвовать возможность вывода индекса, так как просто может не быть типа необходимого размера при приведении size_t к беззнаковому целому. Собственно, сам суфикс _t намекает на то, что это typedef некоторого типа ( есть, конечно, шанс, что не стандартного ). Хотя может это сокращение не от typedef, а от type . Если Вы вдруг встречали такую реализацию ( может упомянутый VS? но не указана версия ), то буду признателен, если Вы ее назовете. Самому инетресно.

Добавлено через 8 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
для имён я её не смог сделать
Variable в данном макросе является параметром. Оператор # в макросах, обрамляет параметр в двойные кавычки.
Например:
C++
1
2
3
4
5
6
7
int a = 10;
 
LOG( a ); //в StripXML передается "a"
 
int *p = new int( 12 );
 
LOG( *a ); //в StripXML передается "*P"
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 08:35  [ТС]     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
Variable в данном макросе является параметром. Оператор # в макросах, обрамляет параметр в двойные кавычки. То есть получается имя параметра в виде C-строки. Откуда следует, что в StripXML передается имя параметра.Например:
Вот только это не единственный макрос, где участвует эта функция. В данном макросе это просто хвост от попыток добиться правильного отображения в браузере тегов, соответствующих членам и безымянным переменным, функция же после безуспешных попыток добиться экранирования символов в тегах осталась для значений и используется в других макросах.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.11.2014, 08:44     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #12
Понянто. Тогда без полной картины нельзя точно сказать, что не так. Я создал StripXML, которая просто возращает свой аргумент ( const char * ) и у меня все работает нормально. В качестве Log использовал std::cout.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2909 / 1445 / 397
Регистрация: 18.10.2014
Сообщений: 2,663
26.11.2014, 08:53     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #13
Цитата Сообщение от taras atavin Посмотреть сообщение
на поддерживала тип hyper.
Она поддерживала тип '__int64', который стандартным не являлся.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 08:55  [ТС]     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #14
Переписал так:
C++
1
#define LOG(Variable) Log<<"<Variable>"<<std::endl<<"<Identifier>"; Log<<StripXML(#Variable); Log<<"</Identifier>"<<std::endl<<"<Bits>x"<<std::dec<<std::noshowbase<<8*sizeof(Variable)<<std::hex<<std::showbase<<"</Bits>"<<std::endl<<"<Line>"<<std::dec<<std::noshowbase<<__LINE__<<std::hex<<std::showbase<<"</Line>"<<std::endl<<"<Adress>"<<(void*)&Variable<<"</Adress>"<<std::endl<<"<Value>"; Log<<Variable; Log<<"</Value>"<<std::endl<<"</Variable>"<<std::endl
, теперь и имена экранирутся, а значения экранируют перегруженные операторы.

Добавлено через 16 секунд
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Она поддерживала тип '__int64', который стандартным не являлся.
Тип hyper.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2909 / 1445 / 397
Регистрация: 18.10.2014
Сообщений: 2,663
26.11.2014, 09:20     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #15
Цитата Сообщение от Toshkarik Посмотреть сообщение
А о том, что он является одним из фундаментальных типов для этой платформы.
Я не знаю, что такое "фундаментальные типы для этой платформы" и к чему они тут. Речь идет о том, что список операторов форматированного ввода вывода в спецификации языка содержит только стандартные типы. А на какие-то "фундаментальные типы для этой платформы" стандарту языка глубоко наплевать. Операторов ввода-вывода для остальных - нестандартных - типов спецификацией языка не требуется. Если специального оператора для нестандартного 'size_t' нет, то компилятор будет пытаться использовать какой-то из уже существующих с возникновением ambiguity. Я думаю, что ошибка, отрапортованная в первом сообщении ТС произошла именно из-за этого.

Цитата Сообщение от Toshkarik Посмотреть сообщение
По Вашей логике получается, что в некоторой реализации может отсутсвовать возможность вывода индекса, так как просто может не быть типа необходимого размера при приведении size_t к беззнаковому целому.
Именно так.

Порывшись в С++11 я не увидел нигде требования, чтобы стандартные потоки умели выводить 'size_t'.

Цитата Сообщение от Toshkarik Посмотреть сообщение
Собственно, сам суфикс _t намекает на то, что это typedef некоторого типа ( есть, конечно, шанс, что не стандартного ).
Да, это typedef. Хотя С++11 вроде уже ушел от того, чтобы заявлять об этом явно. Но в спецификации языка ясно же сказано, что это - платформенно-зависимый тип. Известно только, что он должен быть беззнаковым. Но нигде не требуется, чтобы этот тип совпадал с каким-то стандартным типом.

Цитата Сообщение от Toshkarik Посмотреть сообщение
Если Вы вдруг встречали такую реализацию ( может упомянутый VS? но не указана версия ), то буду признателен, если Вы ее назовете.
О какой именно реализации идет речь? Я уже называл реализацию: любая VS с поддержкой x64, но без поддержки 'long long'. Такая VS использовала 'unsigned __int64' в качестве 'size_t'. Это - нестандартный тип. Вот чего я не помню, так это был ли в ней реализованы операторы ввода-вывода для 'unsigned __int64'...

Добавлено через 5 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Тип hyper.
Нет, именно '__int64'. Тип 'hyper' - это тип из каких-то настолько замшелых и покрытых песками памяти версий Visual Studio, что о нем не помнит даже Интернет. Когда существовал тип 'hyper', 64-битный тип 'size_t' был еще не нужен.

Забудь про 'hyper' навсегда. Это было давно и неправда...
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.11.2014, 09:28     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот чего я не помню, так это был ли в ней реализованы операторы ввода-вывода для 'unsigned __int64'...
Вот в этом суть вопроса была.

Добавлено через 2 минуты
То есть об вводе/выводе типа size_t должно быть что то сказано в стандарте. Нужно будет поискать.

Добавлено через 2 минуты
Вот здесь http://www.cplusplus.com/reference/cstring/size_t/ сказано, что он
Alias of one of the fundamental unsigned integer types.
Сайт является справочником.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 09:36  [ТС]     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Такая VS использовала 'unsigned __int64' в качестве 'size_t'. Это - нестандартный тип.
Мелкомягко-студийный тип разрядности 64 бита зовут hyper.

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, именно '__int64'. Тип 'hyper' - это тип из каких-то настолько замшелых и покрытых песками памяти версий Visual Studio, что о нем не помнит даже Интернет. Когда существовал тип 'hyper', 64-битный тип 'size_t' был еще не нужен.
Забудь про 'hyper' навсегда. Это было давно и неправда...
Не так уже давно, всего лишь четвёртая версия.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2909 / 1445 / 397
Регистрация: 18.10.2014
Сообщений: 2,663
26.11.2014, 10:21     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #18
Цитата Сообщение от Toshkarik Посмотреть сообщение
Сайт является справочником.
cplusplus.com - сравнительно низкокачественный сайт, на котором часто встречаются неточности именно вот в таких деталях. Существенно более уважаемый сайт - cppreference.com - относится к спецификации языка более педантично.

Цитата Сообщение от taras atavin Посмотреть сообщение
Мелкомягко-студийный тип разрядности 64 бита зовут hyper.
Нет, никакого типа 'hyper' в компиляторах C и C++ студии уж давно как нет. Когда то такой тип был, но его уже давно заменили на '__int64'. Причем именно заменили: ни одна студия с тех пор не знает никакого 'hyper'.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
26.11.2014, 10:54     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #19
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
cplusplus.com - сравнительно низкокачественный сайт, на котором часто встречаются неточности именно вот в таких деталях. Существенно более уважаемый сайт - cppreference.com - относится к спецификации языка более педантично.
По мне так наоборот. Больше неточностей встречал на cppreference, поэтому считаю cplusplus выше уровнем, он и существует дольше.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, никакого типа 'hyper' в компиляторах C и C++ студии уж давно как нет.
С Тарасом можно даже не спорить. Бесполезно.
По найденым клочкам, сделал вывод, что вроде этот тип был еще во времена перехода с 16 на 32 битные системы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2014, 11:16     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}'
Еще ссылки по теме:

C++ Почему возникает ошибка? error: ambiguous overload for 'operator>>'
Странная перегрузка операторов (Error: ambiguous overload for 'operator[]') C++
C++ Чтение бинарного файла в поток std::ifstream и вывод в другой бинарный файл std::ofstream (создание копии)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
26.11.2014, 11:16     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' #20
taras atavin, если много где используется xml - советую либу pugixml. Она простая и может быть "one header file".

Добавлено через 33 секунды
И чем не устраивает шаблонная функция?

Добавлено через 3 минуты
Цитата Сообщение от Toshkarik Посмотреть сообщение
Больше неточностей встречал на cppreference, поэтому считаю cplusplus выше уровнем, он и существует дольше.
Да что тут мериться, справочники они и есть справочники. В них полезно быстренько про функцию/контейнер почитать и способ применения посмотреть. В остальном есть только один достоверный источник информации - стандарт, остальное от лукавого. Думаю, все тут с этим согласны.
Yandex
Объявления
26.11.2014, 11:16     Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}'
Ответ Создать тему
Опции темы

Текущее время: 23:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru