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 E前向声明 aclass foobar::internal::E与 . 无关class foobar::D。你必须在声明他们为朋友之前声明Dand :E

namespace foobar
{
  class D;
  typedef D E;

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

请注意,这只适用于 C++11。对于 C++03,您根本无法将 a 声明typedef为朋友,您需要在此处编写friend class ::foobar::D.

于 2012-03-07T22:51:57.123 回答