Ограничение основано на объявленном типе возврата вашего метода.Ваш код гласит:
f() {
in case one: return A;
in case two: return B;
in case three: return C;
}
Когда на самом деле компилятору требуется что-то вроде этого:
FooType f() {
in case one: return A;
in case two: return B;
in case three: return C;
}
Должна быть возможность преобразовать A, B и C в тип FooType, обычночерез простое наследование, хотя я не буду вдаваться в различия между подклассами и подтипами.
Существуют подходы, которые могут обойти это.Вы можете создать класс или структуру (C ++), в которой есть поля для каждого различного типа возможного возврата, и использовать некоторое поле флага, чтобы указать, какое поле является фактическим возвращаемым значением.
class ReturnHolder {
public int fieldFlag;
public TypeA A;
public TypeB B;
public TypeC C;
}
Пример перечисления в другом ответе похож на другой.Причина, по которой это является хаком, заключается в том, что код, который обрабатывает возврат из этого метода, должен иметь много кода для обработки каждого из возможных вариантов, например,
main(){
FooType *x = new FooType();
ReturnHolder ret = x.f();
switch (ret.fieldFlag)
case: 1
//read ret.A
case: 2
//read ret.B
case: 3
//read ret.C
}
И это даже не вдаваясь впытаясь сделать это с исключениями, которые создают еще большие проблемы.Возможно я добавлю это позже как редактирование.