Почему для return type надо уточнить какой enum
TestClass::ePower TestClass::GetPower()
, а для входного параметра нет?
void TestClass::SetPower( ePower _power )
при написании реализации вне класса ?
Весь hello world код:
#include
//////////////////////////////////////////////////////////////////////////
enum class ePower
{
other,
};
//////////////////////////////////////////////////////////////////////////
class TestClass
{
public:
enum class ePower
{
on,
off
};
private:
ePower power;
public:
void SetPower( ePower _power );
ePower GetPower();
};
////////////////////////////////////////////////////////////////////
void TestClass::SetPower( ePower _power )
{
power = _power;
}
TestClass::ePower TestClass::GetPower()
{
return power;
}
int main()
{
TestClass a;
a.SetPower( TestClass::ePower::on );
}
Ответ
В соответствии с правилами поиска неквалифицированных имен, в частности, имена, используемые вне декларатора функции-члена класса, как, например, используемые в описании возвращаемого значения, ищутся в той области, где определен класс.
Имена, используемые в частности в деклараторе функции-члене класса, ищутся в области определения класса.
Поиск неквалифицированных имен для вашего примера описан в параграфах №7 и №8 раздела 3.4.1 Unqualified name lookup стандарта C++.
7 A name used in the definition of a class X outside of a member
function body, default argument, exceptionspecification,
brace-or-equal-initializer of a non-static data member, or nested
class definition29 shall be declared in one of the following ways:
— before its use in class X or be a member of a base class of X
(10.2), or
— if X is a nested class of class Y (9.7), before the definition of X
in Y, or shall be a member of a base class of Y (this lookup applies
in turn to Y ’s enclosing classes, starting with the innermost
enclosing class),30 or
— if X is a local class (9.8) or is a nested class of a local class,
before the definition of class X in a block enclosing the definition
of class X, or
— if X is a member of namespace N, or is a nested class of a class
that is a member of N, or is a local class or a nested class within a
local class of a function that is a member of N, before the definition
of class X in namespace N or in one of N ’s enclosing namespaces.
и
8 For the members of a class X, a name used in a member function body,
in a default argument, in an exceptionspecification, in the
brace-or-equal-initializer of a non-static data member (9.2), or in
the definition of a class member outside of the definition of X,
following the member’s declarator-id31, shall be declared in one of the
following ways:
— before its use in the block in which it is used or in an enclosing
block (6.3), or
— shall be a member of class X or be a member of a base class of X
(10.2), or
— if X is a nested class of class Y (9.7), shall be a member of Y, or
shall be a member of a base class of Y (this lookup applies in turn to
Y’s enclosing classes, starting with the innermost enclosing class),32
or
— if X is a local class (9.8) or is a nested class of a local class,
before the definition of class X in a block enclosing the definition
of class X, or
— if X is a member of namespace N, or is a nested class of a class
that is a member of N, or is a local class or a nested class within a
local class of a function that is a member of N, before the use of the
name, in namespace N or in one of N ’s enclosing namespaces.
И сноска 31
31) That is, an unqualified name that occurs, for instance, in a
type in the parameter-declaration-clause or in the
exception specification.
Эти же правила дублируются и в других разделах, где описание относится к классам.
Комментариев нет:
Отправить комментарий