0

私は一晩中コンパイラと戦いましたが、アイデアが尽きてしまいました...

保護された機能を持つ名前空間内に CRTP 構造があります。派生クラス (同じくその名前空間内) は、別の名前に型定義されています。

その隣には、その関数を呼び出そうとする静的関数を持つクラス (別の名前に型定義されています) があります。だから私は友達を作り始めますが、それでもコンパイラ(私の場合はVS 2010)は関数へのアクセスを許可しません。

一部のコードはおそらくより明確です。

namespace foobar
{
namespace internal
{
    template <typename T>
    class A
    {
        friend class E;

    protected:
        void foo()
        {
            static_cast<T*>(this)->_foo();
        }
    };

    class B : public A<B>
    {
        friend class E;
        friend class A<B>;

    protected:
        void _foo()
        {
            printf("Foo from B\n");
        }
    };
}

typedef internal::B C;

class D
{
public:
    static void Bar();

};

typedef D E;

    void D::Bar()
    {
        C mB;
        mB.foo();
    }   
}//foobar namespace

ここに表示されていないものと、これを解決する方法を誰か教えてもらえますか?

乾杯

4

1 に答える 1

0

あなたの宣言は、 とは関係のないfriend class Ea を前方宣言します。友達として宣言する前に、次のように宣言する必要があります。class foobar::internal::Eclass foobar::DDE

namespace foobar
{
  class D;
  typedef D E;

  namespace internal
  {
    template <typename T>
    class A
    {
      friend E;
      // ...

これは C++11 でのみ機能することに注意してください。C++03 では、 をフレンドとして宣言することはまったくできません。typedefそこに を記述する必要がありますfriend class ::foobar::D

于 2012-03-07T22:51:57.123 に答える