That's two-phase lookup for you.
Base<T>::NO_ZEROFILL
(all caps identifiers are boo, except for macros, BTW) is an identifier that depends on T
.
Since, when the compiler first parses the template, there's no actual type substituted for T
yet, the compiler doesn't "know" what Base<T>
is. So it cannot know any identifiers you assume to be defined in it (there might be a specialization for some T
s that the compiler only sees later) and you cannot omit the base class qualification from identifiers defined in the base class.
That's why you have to write Base<T>::NO_ZEROFILL
(or this->NO_ZEROFILL
). That tells the compiler that NO_ZEROFILL
is something in the base class, which depends on T
, and that it can only verify it later, when the template is instantiated. It will therefore accept it without trying to verify the code.
That code can only be verified later, when the template is instantiated by supplying an actual parameter for T
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…