C++ 为什么我可以通过模板类扩展私有嵌套类?

C++ 为什么我可以通过模板类扩展私有嵌套类?,c++,templates,inheritance,nested,C++,Templates,Inheritance,Nested,我遇到了一个奇怪的现象,模板类似乎可以扩展私有嵌套类 给定以下私有嵌套类: class A { private: class B { protected: void doSomething() { ... } }; }; 以下内容未按预期编译: class C : public A::B { public: C() { this->doSomething(); } }; 然而,gcc似乎乐于接受以下内容,即编译时不会发出呜咽声,实

我遇到了一个奇怪的现象,模板类似乎可以扩展私有嵌套类

给定以下私有嵌套类:

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();
  }
};
模板
C类:公共A::B{
公众:
C(){
这个->doSomething();
}
};
是否有人知道这是使用模板时的预期行为,或者我在gcc中发现了一个奇怪之处。我的版本是4.4.5(Ubuntu/Linaro4.4.4-14ubuntu5),所以我意识到我有点过时了。如果这是预期的行为,我将非常感谢解释(或指向解释的指针),因为这不是我预期的,我想了解更多

非常感谢,,
Matt

这应该是编译器错误。该类不能从非
a
朋友的任何类访问,包括类模板的任何实例化

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]"
错误:类“A::B”(在第5行声明)不可访问
结构C:A::B{
^
在实例化类“C[T=int]时检测到”

Hi David。我想这一定是编译器的问题,因为我一辈子都看不到是什么使类模板能够在私有嵌套类上获得可见性。我确实想知道是否有一些我以前从未听说过的模板巫术,但我觉得太不对了。我真的很感谢您的测试在几个编译器上运行它,因为我目前只能访问gcc 4.4.5,所以您已经远远超出了调用范围。感谢和非常感谢您在VS上进行的测试。我认为这不是预期的行为……但是当编译器说一件事,而您又想另一件事时,会让您停下来问自己一些问题。Cheers@Matt__E_:您可以在线使用comeau(长期以来,这一直被认为是最符合标准的编译器).现在,这是一个方便的链接。我知道Comeau非常符合标准,但不知道您可以提交代码进行在线编译。为该链接干杯。它可能会让我在以后的工作中省去更多的麻烦future@Matt__E_:请注意,上面的链接仅用于编译器,它不会链接或执行代码。您可以购买编译器前端以一个相当小的价格结束(如果我没记错的话是50美元)。FWIW,这里有一个可编译的测试用例:感谢Ben。非常感谢!这个bug已经被报告了-请看。(我正要提交类似的bug报告:)