This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 118c. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2025-10-11
I can't find the answer to the following in the standard. Does anybody have a reference?
The syntax for elaborated type specifier is
class foo<int> // foo is a template
On the other hand, a friend declaration seems to require this production,
An elaborated-type-specifier shall be used in a friend declaration for a class.*And in 13.7.5 [temp.friend] we find the example[Footnote: The class-key of the elaborated-type-specifier is required. —end footnote]
[Example:
template<class T> class task;
template<class T> task<T>* preempt(task<T>*);
template<class T> class task {
// ...
friend void next_time();
friend void process(task<T>*);
friend task<T>* preempt<T>(task<T>*);
template<class C> friend int func(C);
friend class task<int>;
template<class P> friend class frd;
// ...
};
Is there some special dispensation somewhere to allow the syntax in this
context? Is there something I've missed about elaborated-type-specifier?
Is it just another bug in the standard?
An additional problem was reported via comp.std.c++: the grammar does not allow the following example:
namespace A{
class B{};
};
namespace B{
class A{};
class C{
friend class ::A::B;
};
};
Proposed resolution (10/00):
Change the grammar in 9.2.9.5 [dcl.type.elab] to read