CRTP里面的命名空间或typedef和朋友

时间:2012-03-07 22:21:19

标签: c++ namespaces typedef friend crtp

我和编译器打了一整夜,我的想法已经用完......

我在具有受保护功能的命名空间内有一个CRTP结构。 派生类(也在该命名空间内)被typedefed为另一个名称。

在我旁边有一个类(也是另一个名字的类型),它有一个试图调用该函数的静态函数。所以我开始交朋友,但仍然是编译器(在我的情况下是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

任何人都可以告诉我我在这里没有看到什么以及如何解决这个问题?

欢呼声

1 个答案:

答案 0 :(得分:0)

您的声明friend class E转发声明与class foobar::internal::E无关的class foobar::D。在将其声明为朋友之前,您必须声明DE

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