在C ++中查找模板化基类中的名称

时间:2017-08-19 12:39:08

标签: c++ class templates base-class name-lookup

我正在阅读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 ;. (但它没有抱怨iB中是私有的。)

但是,如果未在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;
}

编译器默认不在模板化基类中查找名称。 但是,即使我告诉他们,为什么他们仍然做不到?

1 个答案:

答案 0 :(得分:2)

  

但是,即使我告诉他们,为什么他们仍然不做?

由于未使用成员函数Foo,因此它根本不是instantiated

  

这适用于类模板的成员:除非在程序中使用该成员,否则它不会被实例化,也不需要定义。

如果Foo被调用,您可能会获得error,例如

D<int> d;
d.Foo();

顺便说一句

  

但它没有抱怨iB中是私密的。

因为在名称查找后执行辅助功能检查。找不到名称i,然后可以检查无任何可访问性。