Почему тип возвращаемого значения setVal имеет тип string, а тип параметра имеет тип double
typedef string Type;
Type initVal();
class Exercise {
public:
typedef double Type;
Type setVal(Type);
Type initVal();
private:
int val;
};
Type Exercise::setVal(Type parm) {
val = parm + initVal();
return val;
}
Когда функции-члены определены в области пространства имен, C ++ предоставляет специальные правила поиска имен для неквалифицированных имен, которые следовать функции описатель-идентификатор (3.4.1 / 8). Такие имена ищутся в области видимости класса прежде, чем они будут найдены в области имен.
Поскольку тип возвращаемого значения в «обычном» определении функции-члена предшествует функция-х описатель-идентификатор, вышеупомянутые специальные правила не распространяются на него. Поиск осуществляется в соответствии с «обычными» правилами: в области имен.
По этой причине тип возвращаемого вами определения функции относится к ::Type
не Exercise::Type
, Он не соответствует ни одному из объявлений, сделанных внутри класса. Код плохо сформирован.
Если вы хотите, чтобы неквалифицированное имя возвращаемого типа также просматривалось в области видимости класса, используйте новый конечный тип возврата синтаксис в объявлении функции, так как в этом синтаксисе тип возврата следует функция-х описатель-идентификатор
auto Exercise::setVal(Type parm) -> Type {
val = parm + initVal();
return val;
}
Этот код не компилируется, и мне трудно разобраться, что он должен делать, но я думаю, что ответ на ваш вопрос заключается в том, что параметр имеет тип Exercise::Type
в то время как возвращаемое значение имеет тип ::Type
глобальный typedef. Если вы хотите, чтобы они совпадали, когда вы определяете setVal
вне определения класса, вам нужно полностью указать возвращаемое значение как Exercise::Type
, а так:
typedef string Type;
class Exercise {
public:
typedef double Type;
Type setVal(Type);
Type initVal() { return 1.0; }
private:
int val;
};
Exercise::Type Exercise::setVal(Type parm) {
val = parm + initVal();
return val;
}
Потому что локальная переменная будет автоматически покрывать глобальную переменную.