#
If the class-key or enum keyword in an elaborated-type-specifier is followed by an identifier that is not followed by ​::​, lookup for the identifier is type-only ([basic.lookup.general]).
[Note 1: 
In general, the recognition of an elaborated-type-specifier depends on the following tokens.
If the identifier is followed by ​::​, see [basic.lookup.qual].
— end note]
If the terminal name of an elaborated-type-specifier is a qualified name, lookup for it is type-only.
If the name lookup does not find a previously declared type-name, the elaborated-type-specifier is ill-formed.
[Example 1: struct Node { struct Node* Next; / OK, refers to injected-class-name Node struct Data* Data; / OK, declares type Data at global scope and member Data }; struct Data { struct Node* Node; / OK, refers to Node at global scope friend struct ::Glob; / error: Glob is not declared, cannot introduce a qualified type ([dcl.type.elab]) friend struct Glob; / OK, refers to (as yet) undeclared Glob at global scope. /* ... */ }; struct Base { struct Data; / OK, declares nested Data struct ::Data* thatData; / OK, refers to ​::​Data struct Base::Data* thisData; / OK, refers to nested Data friend class ::Data; / OK, global Data is a friend friend class Data; / OK, nested Data is a friend struct Data { /* ... */ }; / Defines nested Data }; struct Data; / OK, redeclares Data at global scope struct ::Data; / error: cannot introduce a qualified type ([dcl.type.elab]) struct Base::Data; / error: cannot introduce a qualified type ([dcl.type.elab]) struct Base::Datum; / error: Datum undefined struct Base::Data* pBase; / OK, refers to nested Data — end example]

Follow Lee on X/Twitter - Father, Husband, Serial builder creating AI, crypto, games & web tools. We are friends :) AI Will Come To Life!

Check out: eBank.nz (Art Generator) | Netwrck.com (AI Tools) | Text-Generator.io (AI API) | BitBank.nz (Crypto AI) | ReadingTime (Kids Reading) | RewordGame | BigMultiplayerChess | WebFiddle | How.nz | Helix AI Assistant