Почему неявное преобразование типов не выполняется для пользовательского типа в следующем исходном коде?
Неявное преобразование типа в тип A должно произойти в закомментированной строке, но этого не произошло, и в этой строке возникла ошибка.
Я хотел бы знать грамматические правила и решения для этой ошибки.
#include <iostream>
using namespace std;
class A {
int v;
public:
A(int _v): v(_v) {}
operator int (void) const {
return v;
}
friend ostream& operator << (ostream& os, const A& s) {
return os << "A: " << s.v;
}
};
class B {
int x, y;
public:
B(int _x, int _y): x(_x), y(_y) {}
operator A(void) const {
return A(x+y);
}
};
int main(void)
{
B b(1,2);
cout << A(b) << endl;
cout << (A)b << endl;
cout << b << endl; // error --> why?
return 0;
}
--> Дополнительный вопрос
Спасибо за ответ Сэма Варшавчика.
Определение класса A, как показано ниже, решает проблему.
class A {
int v;
public:
A(int _v): v(_v) {}
operator int (void) const {
return v;
}
friend ostream& operator << (ostream& os, const A& s);
};
ostream& operator << (ostream& os, const A& s){
return os << "A: " << s.v;
}
//////////////
class A {
int v;
public:
A(int _v): v(_v) {}
operator int (void) const {
return v;
}
friend ostream& operator << (ostream& os, const A& s){
return os << "A: " << s.v;
}
};
ostream& operator << (ostream& os, const A& s);
Объявлять ли «оператора ‹‹» другом, похоже, здесь не имеет значения. Поскольку функция является глобальной функцией, на нее можно ссылаться в других классах или других функциях. Я думаю, имеет значение, находится ли блок, определяющий функцию, внутри или снаружи класса A. Почему при использовании внутреннего определения необходимо объявление функции? Я хочу знать грамматическую основу.
(A)b
. Приведение в стиле C будет угрожатьb
какA
независимо от того, имеет ли это смысл или нет. Здесь это имеет смысл. Так будет не всегда. Это было бы хорошим местом дляstatic_cast
.static_cast
следит за тем, чтобы актерский состав имел смысл. - person user4581301   schedule 15.03.2020