C++ boost::intrusive_ptr类的前向声明可减少编译时间

C++ boost::intrusive_ptr类的前向声明可减少编译时间,c++,boost,forward-declaration,C++,Boost,Forward Declaration,我有一个类A,它使用boost::intrusive\u ptr保存一些数据: #include "Data.h" class A { boost::intrusive_ptr<Data> data; } 这不是一句谚语 “侵入性发布”:找不到标识符 我尝试添加所需函数的声明: class Data; void intrusive_ptr_add_ref(RefCounted *); void intrusive_ptr_release(RefCounted *);

我有一个类
A
,它使用
boost::intrusive\u ptr
保存一些数据:

#include "Data.h"

class A {
    boost::intrusive_ptr<Data> data;
}
这不是一句谚语

“侵入性发布”:找不到标识符

我尝试添加所需函数的声明:

class Data;

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

class A {
    boost::intrusive_ptr<Data> data;
}
类数据;
无效侵入性添加参考(参考计数*);
无效侵入性释放(参考计数*);
甲级{
boost::侵入性的ptr数据;
}
现在它说

“无效侵入性释放(RefCounted*)”:无法转换参数1 从指向的“Data*”到“RefCounted*”是不相关的;转换 需要重新解释类型转换、C样式转换或函数样式转换


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

我知道解决问题的一个方法是确保头文件中没有(隐式地)为
A
定义构造函数或析构函数。最简单的示例如下所示:

(头文件)

#包括
类数据;
结构A{
boost::侵入性的ptr数据;
A();
~A();
};
void foo(){
A A;
}

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

非常棒的答案。有趣的是(对我来说有点违反直觉),为了加快编译速度,必须牺牲运行时性能(我的意思是使ctor/dtor不内联)。@Nick但情况总是这样。通过使内容不内联,您牺牲了编译时间内联并提高了编译速度。不过,LTO可能会来救援。
class Data;

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

class A {
    boost::intrusive_ptr<Data> data;
}
#include <boost/intrusive_ptr.hpp>
class Data;

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

void foo() {
   A a;
}