4202 / 1794 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||
1 | |||||||||||
Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}'25.11.2014, 20:05. Показов 5236. Ответов 22
Метки нет Все метки)
(
Добавлено через 1 час 13 минут Проблема решена, но не понята:
0
|
|
25.11.2014, 20:05 | |
Ответы с готовыми решениями:
22
ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
|
Вездепух
![]() ![]() 10430 / 5700 / 1552
Регистрация: 18.10.2014
Сообщений: 14,070
|
|
25.11.2014, 20:27 | 2 |
Не пытаться посылать на выход значения типа 'size_t'. В стандартных потоках не гарантируется наличие оператора вывода для того типа , который скрывается за 'size_t' . Хотите выводить 'size_t' - явно приводите его к конкретному стандартному целочисленному типу.
Никакого "решения проблемы" в этой ковровой дорожке длиной в три километра я не увидел и высматривать не собираюсь. Если вы нашли какое-то решение проблемы - описывайте его нормальным русским языком.
0
|
4202 / 1794 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.11.2014, 05:51 [ТС] | 3 |
0
|
1179 / 892 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.11.2014, 07:30 | 4 |
Можно узнать, почему? size_t это гарантированно alias на один из фундаментальных типов. А операторы ввода/вывода вроде перегружены для всех фундаментальных типов.
Добавлено через 9 минут taras atavin, а как Вы используете этот макрос и что за функция ( или макрос ) StripXML?
0
|
4202 / 1794 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.11.2014, 07:37 [ТС] | 5 |
Макрос выводит переменную в xml-лог, записывая её имя, адрес, значение и в какой конкретно строке программы она имеет такое значение. А функция экранирует символы &<>.
0
|
1179 / 892 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.11.2014, 07:44 | 6 |
Вы не перегружали operator<<? У меня оба варианта отрабатывают нормально.
Добавлено через 2 минуты И не понятно, зачем экранировать &<>? Откуда им взяться в имени переменной?
0
|
Вездепух
![]() ![]() 10430 / 5700 / 1552
Регистрация: 18.10.2014
Сообщений: 14,070
|
|
26.11.2014, 07:49 | 7 |
Как раз таки не гарантируется, что за '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' будет использовать именно его.
0
|
4202 / 1794 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.11.2014, 08:03 [ТС] | 8 |
Функция предназначена для значений, для имён я её не смог сделать. Предположим, я хочу залогировать член Name безыменного объекта по указателю Child, в браузере это должно выглядеть так:
. Или я хочу вместо этого залогировать безыменный unsigned long long int по указателю s, в браузере это должно выглядеть так: . Так вот, этого я пока не добился. На адрес не смотрите, он здесь с абсолютно потолочного фрагметнта лога.
0
|
4202 / 1794 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.11.2014, 08:07 [ТС] | 9 |
0
|
1179 / 892 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
26.11.2014, 08:29 | 10 | |||||
TheCalligrapher, так речь не о догадках о том, как ой именно это тип. А о том, что он является одним из фундаментальных типов для этой платформы. В gcc на x86_64 платформе, собственно, long равен 64 битам.
По Вашей логике получается, что в некоторой реализации может отсутсвовать возможность вывода индекса, так как просто может не быть типа необходимого размера при приведении size_t к беззнаковому целому. Собственно, сам суфикс _t намекает на то, что это typedef некоторого типа ( есть, конечно, шанс, что не стандартного ). Хотя может это сокращение не от typedef, а от type . Если Вы вдруг встречали такую реализацию ( может упомянутый VS? но не указана версия ), то буду признателен, если Вы ее назовете. Самому инетресно. Добавлено через 8 минут Variable в данном макросе является параметром. Оператор # в макросах, обрамляет параметр в двойные кавычки. Например:
0
|
4202 / 1794 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.11.2014, 08:35 [ТС] | 11 |
Вот только это не единственный макрос, где участвует эта функция. В данном макросе это просто хвост от попыток добиться правильного отображения в браузере тегов, соответствующих членам и безымянным переменным, функция же после безуспешных попыток добиться экранирования символов в тегах осталась для значений и используется в других макросах.
0
|
1179 / 892 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.11.2014, 08:44 | 12 |
Понянто. Тогда без полной картины нельзя точно сказать, что не так. Я создал StripXML, которая просто возращает свой аргумент ( const char * ) и у меня все работает нормально. В качестве Log использовал std::cout.
0
|
Вездепух
![]() ![]() 10430 / 5700 / 1552
Регистрация: 18.10.2014
Сообщений: 14,070
|
|
26.11.2014, 08:53 | 13 |
0
|
4202 / 1794 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
26.11.2014, 08:55 [ТС] | 14 | |||||
Переписал так:
Добавлено через 16 секунд Тип hyper.
0
|
Вездепух
![]() ![]() 10430 / 5700 / 1552
Регистрация: 18.10.2014
Сообщений: 14,070
|
|
26.11.2014, 09:20 | 15 |
Я не знаю, что такое "фундаментальные типы для этой платформы" и к чему они тут. Речь идет о том, что список операторов форматированного ввода вывода в спецификации языка содержит только стандартные типы. А на какие-то "фундаментальные типы для этой платформы" стандарту языка глубоко наплевать. Операторов ввода-вывода для остальных - нестандартных - типов спецификацией языка не требуется. Если специального оператора для нестандартного 'size_t' нет, то компилятор будет пытаться использовать какой-то из уже существующих с возникновением ambiguity. Я думаю, что ошибка, отрапортованная в первом сообщении ТС произошла именно из-за этого.
Именно так. Порывшись в С++11 я не увидел нигде требования, чтобы стандартные потоки умели выводить 'size_t'. Да, это typedef. Хотя С++11 вроде уже ушел от того, чтобы заявлять об этом явно. Но в спецификации языка ясно же сказано, что это - платформенно-зависимый тип. Известно только, что он должен быть беззнаковым. Но нигде не требуется, чтобы этот тип совпадал с каким-то стандартным типом. О какой именно реализации идет речь? Я уже называл реализацию: любая VS с поддержкой x64, но без поддержки 'long long'. Такая VS использовала 'unsigned __int64' в качестве 'size_t'. Это - нестандартный тип. Вот чего я не помню, так это был ли в ней реализованы операторы ввода-вывода для 'unsigned __int64'... Добавлено через 5 минут Нет, именно '__int64'. Тип 'hyper' - это тип из каких-то настолько замшелых и покрытых песками памяти версий Visual Studio, что о нем не помнит даже Интернет. Когда существовал тип 'hyper', 64-битный тип 'size_t' был еще не нужен. Забудь про 'hyper' навсегда. Это было давно и неправда...
0
|
1179 / 892 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.11.2014, 09:28 | 16 |
Вот в этом суть вопроса была.
Добавлено через 2 минуты То есть об вводе/выводе типа size_t должно быть что то сказано в стандарте. Нужно будет поискать. Добавлено через 2 минуты Вот здесь http://www.cplusplus.com/reference/cstring/size_t/ сказано, что он
0
|
4202 / 1794 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.11.2014, 09:36 [ТС] | 17 |
Мелкомягко-студийный тип разрядности 64 бита зовут hyper.
Добавлено через 1 минуту Не так уже давно, всего лишь четвёртая версия.
0
|
Вездепух
![]() ![]() 10430 / 5700 / 1552
Регистрация: 18.10.2014
Сообщений: 14,070
|
|
26.11.2014, 10:21 | 18 |
cplusplus.com - сравнительно низкокачественный сайт, на котором часто встречаются неточности именно вот в таких деталях. Существенно более уважаемый сайт - cppreference.com - относится к спецификации языка более педантично.
Нет, никакого типа 'hyper' в компиляторах C и C++ студии уж давно как нет. Когда то такой тип был, но его уже давно заменили на '__int64'. Причем именно заменили: ни одна студия с тех пор не знает никакого 'hyper'.
0
|
1179 / 892 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
26.11.2014, 10:54 | 19 |
По мне так наоборот. Больше неточностей встречал на cppreference, поэтому считаю cplusplus выше уровнем, он и существует дольше.
С Тарасом можно даже не спорить. Бесполезно. По найденым клочкам, сделал вывод, что вроде этот тип был еще во времена перехода с 16 на 32 битные системы.
0
|
Форумчанин
![]() ![]() 8193 / 5043 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
26.11.2014, 11:16 | 20 |
taras atavin, если много где используется xml - советую либу pugixml. Она простая и может быть "one header file".
Добавлено через 33 секунды И чем не устраивает шаблонная функция? Добавлено через 3 минуты Да что тут мериться, справочники они и есть справочники. В них полезно быстренько про функцию/контейнер почитать и способ применения посмотреть. В остальном есть только один достоверный источник информации - стандарт, остальное от лукавого. Думаю, все тут с этим согласны.
0
|
26.11.2014, 11:16 | |
Помогаю со студенческими работами здесь
20
Ошибка на "cout <<" no match for operator operand types are std::basic_ostream char ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*') Странная перегрузка операторов (Error: ambiguous overload for 'operator[]') Почему возникает ошибка? error: ambiguous overload for 'operator>>' Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |