6

考虑以下代码:

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++ 中的错误还是我遗漏了什么?

4

3 回答 3

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

显然这是一个错误。

于 2012-12-12T16:37:30.107 回答
1

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

脚注:GCC 编译器可以很好地编译它。

于 2012-12-12T16:29:38.037 回答
0

实际上,A::B是私有的A

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

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

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 也没有。

于 2012-12-13T08:25:04.077 回答