gpt4 book ai didi

c++ - 为什么我可以通过模板类扩展私有(private)嵌套类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:59 30 4
gpt4 key购买 nike

我遇到了一些奇怪的事情,模板类似乎可以扩展私有(private)嵌套类。

给定以下私有(private)嵌套类:

class A {
private:
class B {
protected:
void doSomething() {
...
}
};
};

如预期的那样,以下不会编译:

class C : public A::B {
public:
C() {
this->doSomething();
}
};

但是,gcc 似乎很高兴地接受了以下内容,它编译时没有提示,实际上确实调用了该方法:

template<typename T>
class C : public A::B {
public:
C() {
this->doSomething();
}
};

有谁知道这是否是使用模板时的预期行为,或者我是否在 gcc 中发现了一个奇怪的地方。我使用的是 4.4.5 版(Ubuntu/Linaro 4.4.4-14ubuntu5)所以我意识到我有点过时了。如果这是预期的行为,我将非常感谢解释(或指向解释的指针),因为这不是我所期望的,我想了解更多。

非常感谢,马特

最佳答案

这应该是一个编译器错误。不能从不是 A friend 的任何类访问该类,包括类模板的任何实例。

GCC 4.2.1 和 4.6 接受该代码

Clang++ 拒绝它并显示错误消息

error: 'B' is a private member of 'A'
struct C : A::B {

Comeau 拒绝了带有类似消息的代码

error: class "A::B" (declared at line 5) is inaccessible
struct C : A::B {
^
detected during instantiation of class "C<T> [with T=int]"

关于c++ - 为什么我可以通过模板类扩展私有(private)嵌套类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6325291/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com