我正在阅读Effective C ++ 3rd Edition,第43项和第34页;了解如何访问模板化基类中的名称"。
template<typename T>
class B {
T i;
};
template<typename T>
class D: public B<T> {
public:
void Foo() {
T a = B<T>::i;
}
};
int main() {
D<int> d;
}
对于上述代码,我知道在B<T>::
i
之前是否未添加D::Foo()
,编译器会抱怨&#34; i
未在此声明范围&#34 ;. (但它没有抱怨i
在B
中是私有的。)
但是,如果未在B中声明T i;
,则如下所示,编译进展顺利。
template<typename T>
class B {
};
template<typename T>
class D: public B<T> {
public:
void Foo() {
T a = B<T>::i;
}
};
int main() {
D<int> d;
}
编译器默认不在模板化基类中查找名称。 但是,即使我告诉他们,为什么他们仍然做不到?
答案 0 :(得分:2)
但是,即使我告诉他们,为什么他们仍然不做?
由于未使用成员函数Foo
,因此它根本不是instantiated。
这适用于类模板的成员:除非在程序中使用该成员,否则它不会被实例化,也不需要定义。
如果Foo
被调用,您可能会获得error,例如
D<int> d;
d.Foo();
顺便说一句
但它没有抱怨
i
在B
中是私密的。
因为在名称查找后执行辅助功能检查。找不到名称i
,然后可以检查无任何可访问性。