C++使用two-phase name lookup.在parse模版的时候,第一遍找所有的非dependant-name.而把所有的dependant name留到实例化模版的时候查找。在这个例子中,如果仅仅写'a',那么编译器不认为这是个dependant name,所以就在第一遍parse的时候进行name lookup.但这时候是不考虑模版基类的。所以找不到这个名字。如果加上this->a,那么这就是个dependant name,所以第一遍parse的时候不管它,到实例化的时候再查找。
2-phase name lookup的第2阶段的名字解析,只是进行dependant name 的查找和argument dependant lookup。
Visual C++和老版本的GCC并没有真正的实现2-phase name lookup,而是把模版类里所有的名字查找都留到实例化的时候进行,所以才会接受那样的代码。Clang和新版的GCC是严格执行2-phase name lookup 的。