智能指针,typedef和前向声明

Eva*_*ran 13 c++ typedef smart-pointers

我喜欢使用智能指针,并且已经看到了一些代码,这些代码很好地利用了typedefs make使它们变得更漂亮.例如:

struct A {
    typedef boost::shared_ptr<A> pointer;
};
Run Code Online (Sandbox Code Playgroud)

允许我写: A::pointer a(new A);

但是我在typedef幸福中遇到了一个小问题: - /,前言声明......

想象一下这种情况:

struct B;
struct A {
    boost::shared_ptr<B> b_;
};

struct B {
    boost::shared_ptr<A> a_;
};
Run Code Online (Sandbox Code Playgroud)

效果很好,但我想清理一下.不幸的是,这是行不通的

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_;
};
Run Code Online (Sandbox Code Playgroud)

我理解为什么,在文件中的那一点,编译器没有信息,实际上B中有一个名为的类型pointer.

我有一种感觉,我至少在某些方面坚持使用旧方法,但我很想听到一些聪明的想法.

Pup*_*ppy 6

使用typedef并不会让它变得更漂亮 - 它毫无价值.您可以创建一个shared_ptr不完整的类型,所以只需使用shared_ptr<B>.


Mar*_*k B 3

我可以想到两种方法:

  • 您可以创建一个ptr_for模板并使用它,如下所示ptr_for<B>::type b_ptr_;
  • 您可以 pimpl 这两个结构(我知道这可能不是您正在寻找的),因此实现的定义都可以出现在A和 的定义之后B