【问题标题】:CRTP inside namespace vs typdefs and friends命名空间内的 CRTP vs typdefs 和朋友
【发布时间】:2012-03-07 22:21:18
【问题描述】:

我与编译器斗争了一整夜,我的想法已经用完了......

我在具有受保护功能的命名空间内有一个 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

谁能告诉我我在这里没有看到什么以及如何解决这个问题?

干杯

【问题讨论】:

    标签: c++ namespaces typedef friend crtp


    【解决方案1】:

    你的声明 friend class E 向前声明一个 class foobar::internal::Eclass 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 2010-12-29
      • 1970-01-01
      • 2020-12-03
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多