Er zijn twee vormen van specialisaties; 14.5.4.1 partiele specialisaties en 14.7/3, volledige specialisaties. vector<bool> is een geval van de laatste. De declaratie zelf ( het statement dat begint met
template< > vector<bool> {... ) is noch een template, noch een class, maar een specialisatie van een bestaand template.
14.5.4/3 is anders:
Each class template partial specialization is a distinct template
Het maakt alleen niet zoveel uit hier. Mijn eerste poging rammelde wat. De template parameter T zelf is al dependent, en het moge duidelijk zijn dat je niet overal typename T hoeft te schrijven. typename is pas nodig waar een dependent type als qualifier wordt gebruikt.
Het complete standaard verhaal gaat als volgt:
A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.
We zoeken hier 3 namen, std, vector en T. std wordt via een unqualified lookup gevonden als namespace name, daarna wordt volgens 3.4.3.2/1 vector als template-id gevonden en de class T wordt gevonden in de locale (template) scope. De enige naam die een type aanduidt is dus T; std is een namespace naam en vector een template naam.
Deze lookup gebeurt tijdens instantiatie, niet compilatie (14.6.2/2).
Het geheel ( std::vector<T> ) is dus wel een type, maar 3 namen en typename wordt gebruikt om van een
enkele onduidelijke naam aan te geven dat het een type is.
De volgende vraag is of het fout is. Zoals ik het lees is het fout, omdat je std::vector ermee prefixt. vector is geen type, maar een template.
Hier geldt 14.6.2/3
A qualified-id that refers to a type and in which the nested-name-specifier depends on a template-parameter (14.6.2) shall be prefixed by the keyword typename to indicate that the qualified-id denotes a type...
Dit maakt het helemaal duidelijk.
nested-name-specifier specifier is het deel voor de laatste ::, dus in A::B<C>::D is dat alles behalve D. In ons geval is het alleen std::, en dat hangt overduidelijk niet van T af.
.modbreak: Je was ergens een [/quote] vergeten waardoor het verkeerd ging en er ergens een lap tekst weg viel (een quote in een quote resulteert in een "[..]"). Ik heb het even geedit
[
Voor 10% gewijzigd door
.oisyn op 11-01-2004 21:54
]
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein