Предположим, у меня есть два класса:
// A struct to hold a two-dimensional coordinate.
struct Point
{
float x;
float y;
};
// A struct identical to Point, to demonstrate my problem
struct Location
{
float x;
float y;
};
Я хотел бы неявно преобразовать Location
к Point
:
Point somePoint;
Location someLocation;
somePoint = someLocation;
Итак, я добавил это operator
внутри Point
:
operator Point(Location &other)
{
// ...
}
На котором я собираю с g++ 4.9.2
на Debian, и получите эту ошибку:
error: 'Point::operator Point(Location &other)' must take 'void'
Похоже, что компилятор хочет, чтобы оператор не принимал аргументы, но это кажется неправильным — если я не использую оператор неправильно Каково реальное значение этой ошибки?
Пользовательские операторы преобразования определяются как функция-член для типа от который вы хотите конвертировать в другой тип. Подпись есть (внутри Location
учебный класс):
operator Point() const; // indeed takes void
// possibly operator const& Point() const;
Другая возможность заключается в предоставлении конвертирующий конструктор за Point
:
Point(Location const& location);
Не перегружайте оператора (). Что вы хотите сделать, это создать собственный конструктор, который принимает точку. Компилятор вызывает его, когда вы делаете присваивание или перегружаете оператор присваивания.
Location( Point& p){
x = p.x;
y = p.y;
}
Location& operator= ( Point& p){
x = p.x;
y = p.y;
return *this;
}
Это получит это для компиляции
Point somePoint;
Location someLocation;
somePoint = someLocation;
Location loc = somePoint;