2012-04-01 3 views
-1
class apple 
{ 
    public : 
    operator orange() const { cout << "operator"; } 
} ; 
class orange 
{ 
    public : 
    orange (apple &x){cout <<"constructor";} 
}; 
void f(orange o) 
{ 
    cout <<"function can accept only oranges "; 
} 
int main() 
{ 
    apple a; 
    f(a); 
} 

Выход: Ошибка компилятораКогда конструктор вызывается и когда оператор-функция

Почему этот код дает ошибку компилятора на г ++ компилятор? Почему конструктор оранжевого цвета не вызван при вызове функции f?

+3

Пожалуйста, добавьте сообщение об ошибке на свой вопрос. –

+0

У вас может быть оператор +, operator-, operator = и многие другие ... но не «оранжевый оператор». – Imp

+5

@Imp уверен, что вы можете. –

ответ

4

У вас есть циклическую зависимость:

class apple 
{ 
public : 
    operator orange() const { cout << "operator"; } //depends on orange 
                //shouldn't compile 
} ; 
class orange 
{ 
public : 
    orange (apple &x){cout <<"constructor";} //depends on apple 
}; 

Я удивлен, что вы не получаете ошибки компилятора. В любом случае, вам нужно определить orange, прежде чем определить apple, и вам не нужен оператор orange:

class apple; 
class orange 
{ 
public : 
    orange (apple &x){cout <<"constructor";} 
}; 
class apple 
{ 
public : 
}; 

Это должно работать.

2

Ваш operator orange() не возвращает никаких значений. Все точки операторов преобразования должны преобразовать ваш экземпляр из типа A в тип B.

Вы должны создать экземпляр оранжевого цвета и вернуть его. (Хотя я действительно не вижу смысла превращать яблоко апельсин :))

+0

На самом деле, это неопределенное поведение, чтобы не возвращать значение из функции с невоидным возвращаемым типом. –

+0

Хотя это верно, это не является источником ошибки компиляции. –

+0

ошибка: ожидаемый тип-спецификатор перед «оранжевым» в строке 4, даже если мы определяем оранжевый перед его использованием, тогда также возникает ошибка компилятора. – Luv

Смежные вопросы