Код: Это работает
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;}
компилятор выдает ошибку, говоря
почему компилятор не смотрит на полное определение класса, если он объявлен вперед и находит определение для каждого члена класса, так что программисту не нужно явно определять член где-то снаружи?
Что мешает компилятору сделать это?
В тот момент, когда вы пытаетесь преобразовать число в smallDOUBLE
, ничего больше не известно об этом классе, чем о том, что это класс.
Для всех компиляторов известно, что для выполнения задания может не быть соответствующего конструктора.
Итак, почему компилятор не оставил этот вопрос открытым и заполнить соответствующим кодом, когда он наконец встретит определение класса smallDOUBLE
? Или сделать второй проход через исходный код? Ну, во-первых, это определение может быть в другом блоке перевода, которое затем потребует генерации кода во время соединения, что сегодня не является неслыханным (например, глобальная оптимизация), но C и C++ не требуют. Это не просто техническая проблема. Если бы это было сделано, тогда вы не получили бы никакого реального сообщения об ошибке (о, я, наконец, обнаружил, что нет соответствующего конструктора) до времени ссылки.
compiler-construction
?