#c #class #templates #type-conversion #operator-overloading
#c #класс #шаблоны #преобразование типа #перегрузка оператора
Вопрос:
У меня есть класс, в котором реализована общедоступная string
функция преобразования memeber. В сочетании с operator<<(iostream amp;, xxx)
я ожидаю, что мой класс будет автоматически (неявно) преобразован в string
, что соответствует типу параметра. Таким образом, подходит для типа параметра.
Однако это не так. Почему, я не хочу писать operation<<
функцию.
#include <string>
#include <iostream>
using namespace std;
struct A {
operator string() { return "asd"; }
};
int main() {
cout << A() << endl; // error
cout << string(A()) << endl; // ok
}
Комментарии:
1.
operator<<
взятиеstd::string
(или, если быть точным,std::basic_string
) является шаблоном. Неявные преобразования не учитываются при выводе параметров шаблона.
Ответ №1:
operator<<
For std::string
— это шаблон, и неявное преобразование не будет учитываться при выводе аргумента шаблона, что приводит к сбою.
Вывод типа не учитывает неявные преобразования (кроме настроек типа, перечисленных выше): это работа для разрешения перегрузки, которая произойдет позже.
Как вы показали, вы можете преобразовать A
в std::string
явно или написать operator<<
для A
.