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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

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

25.11.2014, 20:05. Просмотров 1219. Ответов 22
Метки нет (Все метки)

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>}' (C++):

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

Ошибка на "cout <<" no match for operator operand types are std::basic_ostream char - C++
Немного слов про код.Данный код создан для выдачи номера машины,цвета,марки при предоставлении имени.Знаю,что код можно было написать проще...

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*') - C++
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; freopen(fileName, &quot;r&quot;, stdin); while...

Почему возникает ошибка? error: ambiguous overload for 'operator>>' - C++
class planet { protected: double distance; int revolve; public: planet(double d, int r) {distance=d; revolve=r;} };...

Странная перегрузка операторов (Error: ambiguous overload for 'operator[]') - C++
Что-то я туплю. Есть код: #include&lt;string&gt; struct test { int operator(const std::string&amp;)const{return 0;} operator...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3802 / 2060 / 526
Регистрация: 18.10.2014
Сообщений: 3,665
25.11.2014, 20:27 #2
Цитата Сообщение от taras atavin Посмотреть сообщение
Как исправить?
Не пытаться посылать на выход значения типа 'size_t'. В стандартных потоках не гарантируется наличие оператора вывода для того типа , который скрывается за 'size_t' . Хотите выводить 'size_t' - явно приводите его к конкретному стандартному целочисленному типу.

Цитата Сообщение от taras atavin Посмотреть сообщение
Проблема решена,
Никакого "решения проблемы" в этой ковровой дорожке длиной в три километра я не увидел и высматривать не собираюсь. Если вы нашли какое-то решение проблемы - описывайте его нормальным русским языком.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 05:51  [ТС] #3
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если вы нашли какое-то решение проблемы - описывайте его нормальным русским языком.
Я даже не понимаю, в чём проблема была.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.11.2014, 07:30 #4
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В стандартных потоках не гарантируется наличие оператора вывода для того типа , который скрывается за 'size_t' .
Можно узнать, почему? size_t это гарантированно alias на один из фундаментальных типов. А операторы ввода/вывода вроде перегружены для всех фундаментальных типов.

Добавлено через 9 минут
taras atavin, а как Вы используете этот макрос и что за функция ( или макрос ) StripXML?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 07:37  [ТС] #5
Макрос выводит переменную в xml-лог, записывая её имя, адрес, значение и в какой конкретно строке программы она имеет такое значение. А функция экранирует символы &<>.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.11.2014, 07:44 #6
Вы не перегружали operator<<? У меня оба варианта отрабатывают нормально.

Добавлено через 2 минуты
И не понятно, зачем экранировать &<>? Откуда им взяться в имени переменной?
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3802 / 2060 / 526
Регистрация: 18.10.2014
Сообщений: 3,665
26.11.2014, 07:49 #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
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 08:03  [ТС] #8
Цитата Сообщение от Toshkarik Посмотреть сообщение
И не понятно, зачем экранировать &<>? Откуда им взяться в имени переменной?
Функция предназначена для значений, для имён я её не смог сделать. Предположим, я хочу залогировать член Name безыменного объекта по указателю Child, в браузере это должно выглядеть так:
Название: Скрин.png
Просмотров: 43

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

Размер: 5.4 Кб
. Так вот, этого я пока не добился. На адрес не смотрите, он здесь с абсолютно потолочного фрагметнта лога.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 08:07  [ТС] #9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
К примеру, можно взять тот же MS Visual Studio - С++ платформу, которая относительно давно поддерживает 64-битный код (т.е. 64-битный 'size_t'), но до относительно недавнего времени не поддерживала 'long long'.
Она поддерживала тип hyper.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.11.2014, 08:29 #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
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 08:35  [ТС] #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
Variable в данном макросе является параметром. Оператор # в макросах, обрамляет параметр в двойные кавычки. То есть получается имя параметра в виде C-строки. Откуда следует, что в StripXML передается имя параметра.Например:
Вот только это не единственный макрос, где участвует эта функция. В данном макросе это просто хвост от попыток добиться правильного отображения в браузере тегов, соответствующих членам и безымянным переменным, функция же после безуспешных попыток добиться экранирования символов в тегах осталась для значений и используется в других макросах.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
26.11.2014, 08:44 #12
Понянто. Тогда без полной картины нельзя точно сказать, что не так. Я создал StripXML, которая просто возращает свой аргумент ( const char * ) и у меня все работает нормально. В качестве Log использовал std::cout.
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3802 / 2060 / 526
Регистрация: 18.10.2014
Сообщений: 3,665
26.11.2014, 08:53 #13
Цитата Сообщение от taras atavin Посмотреть сообщение
на поддерживала тип hyper.
Она поддерживала тип '__int64', который стандартным не являлся.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 08:55  [ТС] #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
С чаем беда...
Эксперт CЭксперт С++
3802 / 2060 / 526
Регистрация: 18.10.2014
Сообщений: 3,665
26.11.2014, 09:20 #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' навсегда. Это было давно и неправда...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2014, 09:20
Привет! Вот еще темы с ответами:

Error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std:: - C++
Здравствуйте! Сразу попрошу прощения за тупой вопрос. Почему при перегрузке operator &lt;&lt; код template&lt;class T&gt; ostream &amp;operator &lt;&lt;...

Чтение бинарного файла в поток std::ifstream и вывод в другой бинарный файл std::ofstream (создание копии) - C++
Проверил работу программы на маленькой картинке(744 байт). Все работает. С несколько бОльшими файлами(512КБ) нет. Суть задачи в том,...

IntelliSense: отсутствует оператор "<<", соответствующий этим операндам типы операндов: std::basic_ostream<char, std::char_traits<char> - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; struct Stydent { std::string faculty; int rate; ...

C:\Projects\mmz\Compile\CompileAMD64\mmzCompileAMD64\TProjec t.cpp|74|error: declaration of 'std::ofstream File' shadows - C++
error: declaration of 'std::ofstream File' shadows a parameter| std::ofstream File;


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.11.2014, 09:20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru