Поиск имени и область действия класса

Почему тип возвращаемого значения 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;
}

2

Решение

Когда функции-члены определены в области пространства имен, C ++ предоставляет специальные правила поиска имен для неквалифицированных имен, которые следовать функции описатель-идентификатор (3.4.1 / 8). Такие имена ищутся в области видимости класса прежде, чем они будут найдены в области имен.

Поскольку тип возвращаемого значения в «обычном» определении функции-члена предшествует функция-х описатель-идентификатор, вышеупомянутые специальные правила не распространяются на него. Поиск осуществляется в соответствии с «обычными» правилами: в области имен.

По этой причине тип возвращаемого вами определения функции относится к ::Typeне Exercise::Type, Он не соответствует ни одному из объявлений, сделанных внутри класса. Код плохо сформирован.

Если вы хотите, чтобы неквалифицированное имя возвращаемого типа также просматривалось в области видимости класса, используйте новый конечный тип возврата синтаксис в объявлении функции, так как в этом синтаксисе тип возврата следует функция-х описатель-идентификатор

auto Exercise::setVal(Type parm) -> Type {
val = parm + initVal();
return val;
}
4

Другие решения

Этот код не компилируется, и мне трудно разобраться, что он должен делать, но я думаю, что ответ на ваш вопрос заключается в том, что параметр имеет тип 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;
}
0

Потому что локальная переменная будет автоматически покрывать глобальную переменную.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector