前向boost :: intrusive_ptr类的声明以减少编译时间

时间:2018-12-13 18:00:33

标签: c++ boost forward-declaration

我有A类,它使用boost::intrusive_ptr保存了一些数据:

#include "Data.h"

class A {
    boost::intrusive_ptr<Data> data;
}

Data是基类RefCounted的继承者,对于基类intrusive_ptr_releaseintrusive_ptr_add_ref根据需要实现了功能。

我将减少编译时间,所以我尝试使用前向声明:

class Data;

class A {
    boost::intrusive_ptr<Data> data;
}

它不编译说

  

'intrusive_ptr_release':找不到标识符

我试图添加所需功能的声明:

class Data;

void intrusive_ptr_add_ref(RefCounted *);
void intrusive_ptr_release(RefCounted *);

class A {
    boost::intrusive_ptr<Data> data;
}

现在它说

  

'void intrusive_ptr_release(RefCounted *)':无法转换参数1   从“数据*”到“引用计数*”的指向无关;转换   需要reinterpret_cast,C样式强制转换或函数样式强制转换

我了解编译器错误的含义:它不知道RefCountedData的超类,因为Data是不完整的类型。但是,无论如何,在处理增强型侵入指针时,这里是否有任何方法或技巧可以避免包含标头Data.h来加快编译速度?

1 个答案:

答案 0 :(得分:1)

我知道的一种解决方案是,确保头文件中没有A的(隐式)定义的构造函数或析构函数。最小的示例如下:

(头文件)

#include <boost/intrusive_ptr.hpp>
class Data;

struct A {
    boost::intrusive_ptr<Data> data;
    A();
    ~A();
};

void foo() {
   A a;
}

然后,您将在某个地方有一个.cpp文件,它将为A定义(默认)A的构造函数和析构函数,并包括类Data的定义。