Boost logo

Boost :

From: Daniel Frey (daniel.frey_at_[hidden])
Date: 2003-07-22 11:34:05


David Abrahams wrote:
> Daniel Frey <daniel.frey_at_[hidden]> writes:
>
>>They needn't be visible for myclass. They only need to be visible in
>>the namespace where this happened. See 3.4.2/2:
>>
>>"If T is a class type, its associated classes are the class itself and
>>its direct and indirect base classes. Its associated namespaces are
>>the namespaces in which its associated classes are defined."
>>
>>The namespace is what is important here, not the class. The
>>friend-operators declared by X<T> are injected to the namespace as
>>given by 14.6.2/2:
>>
>>"As with non-template classes, the names of namespace-scope friend
>>functions of a class template special-ization are not visible during
>>an ordinary lookup unless explicitly declared at namespace scope
>>(11.4). Such names may be found under the rules for associated classes
>>(3.4.2)."
>>
>>note the "...namespace-scope friend functions...", which to me means
>>that the operators are not injected to X<T>, but to the namespace
>>where the explicit instantiation happened. As this should be the same
>>namespace where T lives, anything should IMHO be legal C++. At least
>>this is how I read the standard.
>
> Maybe I'm missing something in what you say, but I think they are
> "visible for myclass", and the relevant text is in 3.4.2/2:
>
> --- If T is a template-id, its associated namespaces and classes are
> the namespace in which the template is defined; for member templates,
> the member template's class; the namespaces and classes associated
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> with the types of the template arguments provided for template type
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> parameters (excluding template template parameters); the namespaces in
> ^^^^^^^^^^
> which any template template arguments are defined; and the classes in
> which any member templates used as template template arguments are
> defined. [Note: non- type template arguments do not contribute to the
> set of associated namespaces. ]

IIUC, the 'T' that the standard mentions is the 'myclass' in Daniel
Spangenberg's example. The operators provided by X<T> should be found in
T's namespace, so it works whether 'T' is a template-id or not. I thus
thought that the problem was, if 14.6.5 does what we need when
explicitly instantiating X<T>. But maybe I'm missing something.

Regards, Daniel

-- 
Daniel Frey
aixigo AG - financial training, research and technology
Schloß-Rahe-Straße 15, 52072 Aachen, Germany
fon: +49 (0)241 936737-42, fax: +49 (0)241 936737-99
eMail: daniel.frey_at_[hidden], web: http://www.aixigo.de

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk