智能指针、typedef和前向声明
smart pointers, typedefs and forward declarations
我喜欢使用智能指针,并且看过一些代码,这些代码很好地利用了typedef
,使它们更漂亮。例如:
struct A {
typedef boost::shared_ptr<A> pointer;
};
允许我写:A::pointer a(new A);
但我在typedef
的快乐中遇到了一个小障碍://,转发声明。。。
想象一下这个场景:
struct B;
struct A {
boost::shared_ptr<B> b_;
};
struct B {
boost::shared_ptr<A> a_;
};
效果很好,但我很想稍微清理一下。不幸的是,这是不起作用
struct B;
struct A {
typedef boost::shared_ptr<A> pointer;
B::pointer b_; // <-- error here
};
struct B {
typedef boost::shared_ptr<B> pointer;
A::pointer a_;
};
我理解为什么在文件的这一点上,编译器没有信息表明B实际上有一个名为pointer
的类型。
我有一种感觉,至少在某些事情上,我一直在使用旧方法,但我很想听听一些聪明的想法。
typedefs的使用并没有让它变得更漂亮——它毫无价值。您可以将shared_ptr
设置为不完整类型,所以只需使用shared_ptr<B>
即可。
如果您想共享typedef,您可能需要使用名称空间来声明它们:
struct A;
struct B;
namespace Aimpl {
typedef boost::shared_ptr<A> pointer;
}
namespace Bimpl {
typedef boost::shared_ptr<B> pointer;
}
struct A {
Bimpl::pointer b_;
};
struct B {
Aimpl::pointer a_;
};
我可以想到两种方法:
- 您可以创建一个
ptr_for
模板,并使用类似于以下ptr_for<B>::type b_ptr_;
的模板 - 您可以将这两个结构拉入(我知道这可能不是您想要的),这样实现的定义都可以出现在
A
和B
的定义之后
相关文章:
- 向前声明指向类的 typedef 指针
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何创建 typedef 结构的前向声明
- 格式为`int Typedef my_int;`的Typedef声明
- 无法转发声明C typedef结构-正在查找其他建议
- "typedef"类型名称是否可以像"struct"定义那样声明指向结构的指针?
- 具有未声明/未定义类型的 typedef 结构
- 我们可以在声明中的任何位置放置"typedef"说明符吗?
- C++ typedef 函数指针,并在一个语句中声明一个指针
- 错误:使用 tesseract 引擎时 C++ 中的声明'typedef struct tagBLOB BLOB'冲突
- typedef 应该同时在类定义和类声明中吗?
- 向前声明 typedef 保护
- "myStateType"未在此范围内声明,原因 #typedef
- 在 typedef 结构中声明一个数组
- 如何在包含 typedef 时用从右到左的规则解释变量声明
- C 迭代器从Typedef std :: Map作为模板参数声明
- C 使用声明,Typedef和数组类型
- 如何在C++标头中声明typedef
- 使用 FreeTDS 库时出现声明冲突的声明“typedef int RETCODE”错误
- 在c++类中向前声明typedef