Некоторое время назад на comp.lang.c++.moderated проскакивал вопрос, в котором автор приводил такой код:
#include<string>
#include<iostream>
class S
{
public:
operator std::string(){return" ";}
};
int main()
{
std::cout<<S(); // error! but should it be?return 0;
}
Я даже попытался избавиться от стандартной библиотеки, чтобы все было перед глазами (пример не минимальный, просто хотел не отходить далеко от библиотечных сигнатур и аргументов):
Собственно, вопрос: почему не рассматривается мой m4::operator<<( ... ) при разрешении перегрузки? Причем, если (1) заменить на "StringHolder< char, char > const &" то все отлично.
Re: user-defined conversions: could not deduce template argu
Здравствуйте, MuTPu4, Вы писали:
...
MTP>Собственно, вопрос: почему не рассматривается мой m4::operator<<( ... ) при разрешении перегрузки?
Для того чтобы был выбран Ваш operator<< должно произойти пользовательское преобразование типов.
Т.к. operator<< является шаблонным никаких преобразований, кроме тривиальных, при выводе аргументов шаблона, не происходит.
MTP> Причем, если (1) заменить на "StringHolder< char, char > const &" то все отлично.
В этом случае вывода аргументов для 2-го параметра функции шаблона не происходит и преобразование допустимо.
C++ можно выучить за 21 день! ...если дни — полярные.
Re[2]: user-defined conversions: could not deduce template a
On Tue, 06 Dec 2005 18:52:55 +0200, MuTPu4 <40559@users.rsdn.ru> wrote:
> Некоторое время назад на comp.lang.c++.moderated проскакивал вопрос, в котором автор приводил такой код: >
> #include<string>
> #include<iostream>
>
> class S
> {
> public:
/*
етот оператор не работоспособен, ибо приведение к std::string() разрешено только експлисит:
operator std::string(){return std::string(" ");}
*/
> operator std::string(){return" ";}
> };
>int main()
> {
/*
вивод для std::string в стрим не определьон, а оператора operator const char*()
у std::string также нет, есть ф-ция член с_str():
std::cout<< static_cast<std::string>(S()).c_str(); // так работает
*/
> std::cout<<S(); // error! but should it be?
> return 0;
> }
>
>
Posted via RSDN NNTP Server 1.9
make it simple as possible, but not simpler
Re[3]: user-defined conversions: could not deduce template a
Было бы неплохо подкреплять свои утверждения ссылками на авторитетный источник.
В вашем случае, кстати, аргументы могут быть выведены из типа A<int, short> аргумента оператора <<.
Re[4]: user-defined conversions: could not deduce template a
Здравствуйте, NotImplemented, Вы писали:
>> Здравствуйте, lLPl, Вы писали:
NI>Было бы неплохо подкреплять свои утверждения ссылками на авторитетный источник. NI>В вашем случае, кстати, аргументы могут быть выведены из типа A<int, short> аргумента оператора <<.
Я же в обоих своих постах указал, что говорю о 2-м аргументе функции.
В этом случае вывода аргументов для 2-го параметра функции шаблона не происходит и преобразование допустимо.
Для того чтобы вывести аргументы T1 и T2 для 2-го параметра функции t2, должно совершиться преобразование,
что недопустимо.
C++ можно выучить за 21 день! ...если дни — полярные.
Re[5]: user-defined conversions: could not deduce template a
Здравствуйте, andrij, Вы писали:
A>/* A>етот оператор не работоспособен, ибо приведение к std::string() разрешено только експлисит: A> operator std::string(){return std::string(" ");} A>*/
Неправда. у std::string конструктор(char const*) имплицитный. A>/* A> вивод для std::string в стрим не определьон, а оператора operator const char*() A> у std::string также нет, есть ф-ция член с_str(): A> std::cout<< static_cast<std::string>(S()).c_str(); // так работает A>*/
Опять неправда. Строку можно выводить в поток напрямую, без .c_str().
Здравствуйте, lLPl, Вы писали:
LP>>Здравствуйте, NotImplemented, Вы писали:
NI>>>В вашем случае, кстати, аргументы могут быть выведены из типа A<int, short> аргумента оператора <<.
Ладно, дошло, — я неправильно выразился.
Для того чтобы вывести аргументы T1 и T2 для 2-го параметра функции t2,...
Надо было сказать:
Для того чтобы произошла подстановка второго аргумента функции...
C++ можно выучить за 21 день! ...если дни — полярные.
Re: user-defined conversions: could not deduce template argu
Причина — именно в том, что неявные действия
— вывод типа шаблона
— приведение типа
— конструирование (кроме конструктора копирования)
можно делать в количестве "одна штука на аргумент".
(Явные — разумеется, сколько угодно).
А у тебя получилось неявный operator T() + неявное определение типа шаблона.
Было бы двойное приведение типов — тоже получил бы ошибку.
(Где-то в Стандарте об этом написано, но, к сожалению, текста под рукой нет).
Перекуём баги на фичи!
Re[2]: user-defined conversions: could not deduce template a
Спасибо, вроде, разобрался. lLPl наиболее точно назвал проблему, подробности я нашел в 14.8.2.1/3 и в книжке Вандервурда про шаблоны (II.11.4).
К>Чуть более компактный код.
Исправил/дополнил пример, может, кому будет интересно: