我有A
类,它使用boost::intrusive_ptr
保存了一些数据:
#include "Data.h"
class A {
boost::intrusive_ptr<Data> data;
}
类Data
是基类RefCounted
的继承者,对于基类intrusive_ptr_release
和intrusive_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样式强制转换或函数样式强制转换
我了解编译器错误的含义:它不知道RefCounted
是Data
的超类,因为Data
是不完整的类型。但是,无论如何,在处理增强型侵入指针时,这里是否有任何方法或技巧可以避免包含标头Data.h
来加快编译速度?
答案 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
的定义。