为什么Visual C ++无法编译从私有嵌套类继承的朋友模板?

时间:2012-12-12 16:07:53

标签: c++ visual-c++ gcc compiler-errors g++

请考虑以下代码:

class A {
  class B {};

  template <typename T>
  friend class C;
};

template <typename T>
class C : A::B {};

int main() { C<int> c; }

它与GCC和Clang编译良好,但Visual C ++ 2010出错:

test.cc(11) : error C2248: 'A::B' : cannot access private class declared in class 'A'

它是Visual C ++中的错误还是我错过了什么?

3 个答案:

答案 0 :(得分:2)

1998年标准和2011年标准都包含与14.5.3#4和14.5.4#3中相同的代码。

class X {
  template<class T> friend struct A;
  class Y { };
};
template<class T> struct A { X::Y ab; }; // OK
template<class T> struct A<T*> { X::Y ab; }; // OK

显然这是一个错误。

答案 1 :(得分:1)

是。这肯定是Visual C ++编译器中的一个错误。

脚注:GCC编译器编译好了。

答案 2 :(得分:0)

实际上,A::BA私有的。

这可能意味着,但这是我的解释,我将不得不用标准中的段落来支持它,你不能在全局范围内引用A::B,更不用说声明任何A::B的子类了{{ 1}},也不能创建指向A::B等的指针......

另一方面,X 可以访问A::B,因此 it 可以声明它的子类:

class A {
  class B {
  };
  template<typename T> friend class X;
  template<typename T> friend class Y;
};

template<typename T> class X : public A::B{};

template<typename T>
class Y {
  class B2 : public A::B {};
};

int main() { 
   X<int> x; 
   Y<int> y;
}

对于此代码段,Comeau并未告诉我Y无法实例化。 VS2005也没有。