【发布时间】:2021-06-29 00:02:31
【问题描述】:
使用 Visual Studio 2019 (v 16.7.3),我发现模板类可以访问它的非模板基类的私有成员。这是预期行为还是编译器错误?
当派生类不是模板类时,基类的私有成员按预期是不可访问的:
class A
{
};
class Base
{
public:
Base() : m_pA(new A()) {}
private:
A* m_pA;
};
class Derived :
public Base
{
public:
Derived() : Base() {}
A* get_a() { return m_pA; } // 'Base::m_pA': cannot access private member declared in class 'Base'
};
int main()
{
Derived d;
}
== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==
但是,如果我将 Derived 设为模板类,它会毫无怨言地编译:
template<class T>
class Derived :
public Base
{
public:
Derived() : Base() {}
A* get_a() { return m_pA; }
};
int main()
{
Derived<int> d;
}
== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==
【问题讨论】:
-
你能在派生类上调用get_a吗
-
Clang 成功找到错误Demo(即使不需要)。
标签: c++ templates inheritance private