Когда вызывается конструктор и когда оператор-функция - PullRequest
0 голосов
/ 01 апреля 2012
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);
}

Вывод: ошибка компилятора

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

Ответы [ 2 ]

4 голосов
/ 01 апреля 2012

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

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 голосов
/ 01 апреля 2012

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

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

...