5

次のテスト1コードを検討してください。

struct A {
 private:         
     class face;
     friend class face; 
};

struct A::face {};    

template <typename _CharT>
struct C : public A::face
{};

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

このコードは適切に形成されていますか? g++ と comeau でテストしました。g++ は正常にコンパイルしますが、 comeau は次のエラー メッセージを表示します (これは正しいと思います)。

"ComeauTest.c", line 12: error: class "A::face" (declared at line 9) is inaccessible
      struct C : public A::face
                           ^
          detected during instantiation of class "C<_CharT> [with _CharT=int]"
                    at line 17

この場合、どのコンパイラが正しいですか? Comeau は、私が知っている中で最も標準に準拠したコンパイラの 1 つです。g++ はまた間違っていますか?

(1) これは実際のコードではありません。

4

1 に答える 1

6

それは間違っています。faceは非公開なので、C からはアクセスできませんfacefaceは非公開メンバーなので、friending しても効果はありません。

于 2011-12-16T17:52:46.777 に答える