Почему один протип работает в "цпной" форме, а другой - нет?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Код: Выделить всё

std: :o fstream &operator <<  (std: :o fstream  &Stream , const std::wstring  &String);
...
std: :o fstream &operator <<  (std: :o fstream  &Stream , const std::wstring  &String)
{
 ...
 return Stream;
}
...
std::wstring s;
std: :o fstream L;
L<<s; // работает
L<<"sdfagfs"<<s<<"dfsfggfsd";// Не работает, запускается стандартная версия вместо перегруженной.

Код: Выделить всё

std: :o stream &operator <<  (std: :o stream  &Stream , const std::wstring  &String);
...
std: :o stream &operator <<  (std: :o stream  &Stream , const std::wstring  &String)
{
 ...
 return Stream;
}
...
std::wstring s;
std: :o fstream L;
L<<s; // работает
L<<"sdfagfs"<<s<<"dfsfggfsd";// Работает
Почему?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Din666
Сообщения: 52
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

ну для начала литера 'L' зарезервирована, чтобы создавать переменные типа wchar_t
например const std::wstring aaa = L"bbb";
поэтому чтобы избежать путаницы, лучше переименовать переменную L на другую.
чтобы вызывалась требуемая перегрузка в данном случае надо явно указать тип.

L<<std::wstring(L"sdfagfs");

а еще более правильно не путать вместе wchar_t и char, и юзать std::wofstream
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Din666 писал(а):ну для начала литера 'L' зарезервирована, чтобы создавать переменные типа wchar_t
например const std::wstring aaa = L"bbb";
ИзображениеНужны комментарии?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Din666 писал(а):а еще более правильно не путать вместе wchar_t и char, и юзать std::wofstream
Вот только UTF-8 ему по дефолту столь же не понятен, как и для

Код: Выделить всё

std: :o fstream
.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Din666 писал(а):L<<std::wstring(L"sdfagfs");
Ну там не все перегрузки упомянуты.

Код: Выделить всё

std: :o fstream &operator <<  (std: :o fstream  &Stream , const std::wstring  &String);
std: :o fstream &operator <<  (std: :o fstream  &Stream , const wchar_t  *String);
...
std: :o fstream &operator <<  (std: :o fstream  &Stream , const std::wstring  &String)
{
 ...
 return Stream;
}
std: :o fstream &operator <<  (std: :o fstream  &Stream , const wchar_t  *String)
{
 ...
 return Stream;
}
...
std::wstring s;
std: :o fstream L;
L<<s; // работает
L<<"sdfagfs"<<s<<"dfsfggfsd";// Не работает, запускается стандартная версия вместо перегруженной.
,

Код: Выделить всё

std: :o stream &operator <<  (std: :o stream  &Stream , const std::wstring  &String);
std: :o stream &operator <<  (std: :o stream  &Stream , const wchar_t  *String);
...
std: :o stream &operator <<  (std: :o stream  &Stream , const std::wstring  &String)
{
 ...
 return Stream;
}
std: :o stream &operator <<  (std: :o stream  &Stream , const wchar_t  *String)
{
 ...
 return Stream;
}
...
std::wstring s;
std: :o fstream L;
L<<s; // работает
L<<"sdfagfs"<<s<<"dfsfggfsd";// работает
Почему так?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Нужны комментарии?
Да, я добавлю комментарии. Можно вопрос? Где ты видишь, чтобы человек сказал, что так не будет работать? На самом деле, он тебе посоветовал не использовать переменную с таким именем только для того, чтобы "избежать путаницы". Причём, я с ним полностью солидарен в этом совете. В сотый раз прошу тебя, внимательно читай то, что тебе пишут...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

В каком месте он сказал, что имеется ввиду путаница именно для человека? Мифическая, кстати. Если для кого то проблема отличить переменную с именем d от буквы d в имени Ladle другой переменной, то он запутается в любом случае и ничего толкового не напишет, иначе же контекст применения буквы L читается с самой же строки.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):В каком месте он сказал, что имеется ввиду путаница именно для человека?
Чёрт побери, а для кого? Для единорога? Единственное, что ты хорошо умеешь делать - это придираться. Всё остальное так себе...
Сионист писал(а):Мифическая, кстати. Если для кого то проблема отличить переменную с именем d от буквы d в имени Ladle другой переменной, то он запутается в любом случае и ничего толкового не напишет, иначе же контекст применения буквы L читается с самой же строки.
Вообще-то, это бы просто совет. Не нравится - не следуй ему. Пиши такой код, как тебе нравится. Тебе ведь о читабельности заботиться не нужно: твой код никто кроме тебя не читает. Но если бы такое написал в моём проекте, я бы тебе руки оторвал, честно говорю.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Din666
Сообщения: 52
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

Вопрос был про неработающую самодельную перегрузку:
поэтому довольно ясно намекнули, что перегрузка не работает из-за несоответствия типов
"abc" тип char*
L"abc" тип wchar_t*

теперь откуда-то взялся utf-8, который к wstring имеет такое отношение, как Сионист к программированию ))

PS: Дальнейшее обсуждение с Сионист чего-либо считаю бесполезным.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Чёрт побери, а для кого? Для единорога? Единственное, что ты хорошо умеешь делать - это придираться.
Din666 писал(а):ну для начала литера 'L' зарезервирована
Резервируют во избежание путаницы для компилятора.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить