我和编译器打了一整夜,我的想法已经用完......
我在具有受保护功能的命名空间内有一个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
任何人都可以告诉我我在这里没有看到什么以及如何解决这个问题?
欢呼声
答案 0 :(得分:0)
您的声明friend class E
转发声明与class foobar::internal::E
无关的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
。