簡體   English   中英

命名空間中的CRTP與typdefs和好友

[英]CRTP inside namespace vs typdefs and friends

我整夜都在與編譯器作斗爭,但我的構想耗盡了……

我在具有受保護功能的名稱空間中具有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

有人可以告訴我我在這里看不到什么以及如何解決嗎?

干杯

您的聲明friend class E向前聲明了一個class foobar::internal::E class foobar::D ,它與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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM