命名空间内的CRTP与typdfs和朋友
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 Bn");
}
};
}
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::D
无关的class foobar::internal::E
。在将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
。
相关文章:
- 一位朋友将模板函数缩写为clang和gcc
- 班级的朋友是不可接近的
- 与朋友声明相反
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 类似虚拟的朋友功能?
- 为什么C++需要公共继承,忽略朋友声明,才能使动态向下工作?
- 在朋友类中使用模板
- 访问私人成员而不使用朋友类
- 类和朋友在它们之间起作用
- "朋友"成员函数和 GCC 与 Clang
- 朋友声明的复杂范围界定规则有什么意义?
- C++:让函数成为多个类的朋友?
- 有没有办法C++将给定类的功能限制为仅另一个类(不使用继承,朋友)?
- 朋友,前瞻宣言,C++
- 在VS 2017中,朋友通过具有私有析构函数的结构的unique_ptr向量进行迭代失败
- 限制多模板参数朋友函数可访问的类实例的范围
- 朋友定义函数的名称空间是什么
- 朋友函数随机行为
- 从安卓NDK15切换到17使得malloc和朋友找不到
- 命名空间内的CRTP与typdfs和朋友