[英]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
無關。 必須先聲明D
和E
然后才能將它們聲明為朋友:
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.