CATEGORII DOCUMENTE |
Using directives facilitate the use of namespaces and types defined in other namespaces. Using directives impact the name resolution process of namespace-or-type-names (3.8) and simple-names (7.5.2), but unlike declarations, using directives do not contribute new members to the underlying declaration spaces of the compilation units or namespaces within which they are used.
using-directives:
using-directive
using-directives using-directive
using-directive:
using-alias-directive
using-namespace-directive
A using-alias-directive (9.3.1) introduces an alias for a namespace or type.
A using-namespace-directive (9.3.2) imports the type members of a namespace.
The scope of a using-directive extends over the namespace-member-declarations of its immediately containing compilation unit or namespace body. The scope of a using-directive specifically does not include its peer using-directives. Thus, peer using-directives do not affect each other, and the order in which they are written is insignificant.
A using-alias-directive introduces an identifier that serves as an alias for a namespace or type within the immediately enclosing compilation unit or namespace body.
using-alias-directive:
using identifier
= namespace-or-type-name ;
Within member declarations in a compilation unit or namespace body that contains a using-alias-directive, the identifier introduced by the using-alias-directive can be used to reference the given namespace or type. For example:
namespace
N1.N2
}
namespace
N3
}
Above, within member declarations in the N3 namespace, A is an alias for N1.N2.A, and thus class N3.B derives from class N1.N2.A. The same effect can be obtained by creating an alias R for N1.N2 and then referencing R.A:
namespace
N3
}
The identifier of a using-alias-directive must be unique within the declaration space of the compilation unit or namespace that immediately contains the using-alias-directive. For example:
namespace
N3
}
namespace
N3
Above,, N3 already contains a member A, so it is an error for a using-alias-directive to use that identifier. Likewise, it is an error for two or more using-alias-directives in the same compilation unit or namespace body to declare aliases by the same name.
A using-alias-directive makes an alias available within a particular compilation unit or namespace body, but it does not contribute any new members to the underlying declaration space. In other words, a using-alias-directive is not transitive but rather affects only the compilation unit or namespace body in which it occurs. In the example
namespace
N3
namespace
N3
// Error, R unknown
}
the scope of the using-alias-directive that introduces R only extends to member declarations in the namespace body in which it is contained, and R is thus unknown in the second namespace declaration. However, placing the using-alias-directive in the containing compilation unit causes the alias to become available within both namespace declarations:
using R = N1.N2;
namespace
N3
}
namespace
N3
}
Just like regular members, names introduced by using-alias-directives are hidden by similarly named members in nested scopes. In the example
using R = N1.N2;
namespace
N3
class B: R.A // Error, R has no member A
}
the reference to R.A in the declaration of B causes an error because R refers to N3.R, not N1.N2.
The order in which using-alias-directives are written has no significance, and resolution of the namespace-or-type-name referenced by a using-alias-directive is neither affected by the using-alias-directive itself nor by other using-directives in the immediately containing compilation unit or namespace body. In other words, the namespace-or-type-name of a using-alias-directive is resolved as if the immediately containing compilation unit or namespace body had no using-directives. In the example
namespace N1.N2
namespace
N3
the last using-alias-directive is in error because it is not affected by the first using-alias-directive.
A using-alias-directive can create an alias for any namespace or type, including the namespace within which it appears and any namespace or type nested within that namespace.
Accessing a namespace or type through an alias yields exactly the same result as accessing the namespace or type through its declared name. For example, given
namespace
N1.N2
}
namespace
N3
}
the names N1.N2.A, R1.N2.A, and R2.A are completely equivalent and all refer to the class whose fully qualified name is N1.N2.A.
A using-namespace-directive imports the types contained in a namespace into the immediately enclosing compilation unit or namespace body, enabling the identifier of each type to be used without qualification.
using-namespace-directive:
using namespace-name ;
Within member declarations in a compilation unit or namespace body that contains a using-namespace-directive, the types contained in the given namespace can be referenced directly. For example:
namespace
N1.N2
}
namespace
N3
{
using N1.N2;
class B: A
}
Above, within member declarations in the N3 namespace, the type members of N1.N2 are directly available, and thus class N3.B derives from class N1.N2.A.
A using-namespace-directive imports the types contained in the given namespace, but specifically does not import nested namespaces. In the example
namespace
N1.N2
}
namespace
N3
{
using N1;
class B: N2.A // Error, N2 unknown
}
the using-namespace-directive imports the types contained in N1, but not the namespaces nested in N1. Thus, the reference to N2.A in the declaration of B is in error because no members named N2 are in scope.
Unlike a using-alias-directive, a using-namespace-directive may import types whose identifiers are already defined within the enclosing compilation unit or namespace body. In effect, names imported by a using-namespace-directive are hidden by similarly named members in the enclosing compilation unit or namespace body. For example:
namespace
N1.N2
class B
}
namespace
N3
{
using N1.N2;
class A
}
Here, within member declarations in the N3 namespace, A refers to N3.A rather than N1.N2.A.
When more than one namespace imported by using-namespace-directives in the same compilation unit or namespace body contain types by the same name, references to that name are considered ambiguous. In the example
namespace
N1
}
namespace
N2
}
namespace
N3
{
using N1;
using N2;
class B: A // Error, A is ambiguous
}
both N1 and N2 contain a member A, and because N3 imports both, referencing A in N3 is an error. In this situation, the conflict can be resolved either through qualification of references to A, or by introducing a using-alias-directive that picks a particular A. For example:
namespace
N3
{
using N1;
using N2;
using A = N1.A;
class B: A // A means N1.A
}
Like a using-alias-directive, a using-namespace-directive does not contribute any new members to the underlying declaration space of the compilation unit or namespace, but rather affects only the compilation unit or namespace body in which it appears.
The namespace-name referenced by a using-namespace-directive is resolved in the same way as the namespace-or-type-name referenced by a using-alias-directive. Thus, using-namespace-directives in the same compilation unit or namespace body do not affect each other and can be written in any order.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 925
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved