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 に答える