Почему компилятор не смотрит на полное определение класса?

0

Код: Это работает

class smallDOUBLE;

class smallINT
{
private:
int val;   
public:
   smallINT():val(0){}
   smallINT(int i):val(i){}
   operator smallDOUBLE(); //comment this line
  //operator smallDOUBLE(){return val;}
};

class smallDOUBLE
{
private:
double val;
public:
   smallDOUBLE():val(0){}
   smallDOUBLE(double i):val(i){}
   operator smallINT() { return val;}
};

smallINT::operator smallDOUBLE(){return val;} //Comment this line.

int main()
{
  smallINT int1(10);
  smallDOUBLE DBL1(123.22);
  smallINT int2 = DBL1;
  smallDOUBLE DBL2 = int1;
}

Но когда я комментирую smallINT::operator smallDOUBLE(){return val;}, operator smallDOUBLE(); и раскомментирование

operator smallDOUBLE(){return val;} компилятор выдает ошибку, говоря

Изображение 174551

почему компилятор не смотрит на полное определение класса, если он объявлен вперед и находит определение для каждого члена класса, так что программисту не нужно явно определять член где-то снаружи?

Что мешает компилятору сделать это?

Теги:

1 ответ

3
Лучший ответ

В тот момент, когда вы пытаетесь преобразовать число в smallDOUBLE, ничего больше не известно об этом классе, чем о том, что это класс.

Для всех компиляторов известно, что для выполнения задания может не быть соответствующего конструктора.

Итак, почему компилятор не оставил этот вопрос открытым и заполнить соответствующим кодом, когда он наконец встретит определение класса smallDOUBLE? Или сделать второй проход через исходный код? Ну, во-первых, это определение может быть в другом блоке перевода, которое затем потребует генерации кода во время соединения, что сегодня не является неслыханным (например, глобальная оптимизация), но C и C++ не требуют. Это не просто техническая проблема. Если бы это было сделано, тогда вы не получили бы никакого реального сообщения об ошибке (о, я, наконец, обнаружил, что нет соответствующего конструктора) до времени ссылки.

  • 0
    Для записи, Visual Age C ++ просматривает все определения (или, по крайней мере, сделал). Что определенно не соответствует стандарту (поскольку вам не нужны какие-либо включения, и вы можете видеть классы и функции, которые не являются частью текущего модуля перевода); большинство программистов, которых я знаю, считают это ошибкой (и я думаю, что Visual Age, по крайней мере, добавил опцию для ее подавления).
  • 0
    @JamesKanze: Спасибо! Я не знал об этом. В статье из Википедии неясно, существует ли Visual Age C ++ до 2014 года (он был там еще в 2011 году), но веб-страница IBM для него теперь перенаправляется на IBM XL C / C ++.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню