2014-11-06 2 views
2

У меня есть кодоператор T() {} - не работает

class smallDOUBLE; 

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

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

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

Здесь smallINT int2 = DBL1; в основном работает нормально, но smallDOUBLE DBL2 = int1; бросает ошибку говоря

возвращаемый тип smallDOUBLE является неполным

во время компиляции.

Почему operator smallINT() { return val;} работа

тогда operator smallDOUBLE() {return val;} не?

enter image description here

+0

Приведенный выше код, если он помещен в файл cpp, не подлежит компиляции в основном. Он делает это где-то еще. Пожалуйста, отправьте код, который на самом деле демонстрирует вашу проблему и включает в себя как ошибки **, так и ** строку, в которой произошла ошибка. – Yakk

+0

Обратите внимание, что первая ошибка указана в вашем операторе. Ошибка в главном не имеет значения (и вызвана ошибкой в ​​операторе). Ошибки после первого редко используются. – Yakk

ответ

3

Ошибка говорит: для того, чтобы реализовать функцию преобразования, вам нужно типа функциональных новообращенных чтобы быть уже реализованы. Просто переместив определение operator smallDOUBLE() после определения класса smallDOUBLE, вы получите компилируемую программу.

class smallDOUBLE; 

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

class smallDOUBLE 
{ 
private: 
double val; 
public: 
    smallDOUBLE():val(0){} 
    smallDOUBLE(double i):val(i){} 
    // smallINT already defined, no problem here... 
    operator smallINT() { return val;} 
}; 

// now that smallDOUBLE is defined... 
smallINT::operator smallDOUBLE(){return val;} 

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

@ didierc- не является ли компилятор ответственным за определение определения класса, если он объявлен вперед? – InQusitive

+0

@ InQusitive № – leemes

+0

Я думаю, что этот вопрос достаточно сложный, чтобы заслужить «формальное» задание, а не только как комментарий. Если брать буквально, то @leemes прав. В противном случае существует 2 возможных интерпретации: (1) может ли компилятор быть достаточно умным, чтобы определить, хорошо ли определен класс после полного анализа единицы перевода. (2) не мог компилятор предположить, что объявленный класс будет предоставлен позже (возможно, другой единицей перевода) и функция преобразования сделает вызов еще неопределенного символа. – didierc

3

Вы получаете эту ошибку, потому что оператор приведения типа возвращаемого значение не может использовать неполный тип. Чтобы обойти это можно объявить, но не определить, пока другой класс не был определен

class smallDOUBLE; 

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

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

smallINT::operator smallDOUBLE() { return val; } 

Live Example

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