Форвардное объявление для класса boost :: intrusive_ptr для сокращения времени компиляции - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть класс 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: идентификатор не найден(RefCounts *) ': невозможно преобразовать аргумент 1 из «Data *» в «RefCounts *», на который указывает ссылка;преобразование требует reinterpret_cast, приведение в стиле C или приведение в стиле функции

Я понимаю значение ошибок компилятора: он не знает, что RefCounted является суперклассом для Data, потому что Data являетсянеполный тип.Но, в любом случае, есть ли здесь какой-нибудь способ или хитрость, позволяющая избежать включения заголовка Data.h для ускорения компиляции при работе с форсированными навязчивыми указателями?

1 Ответ

0 голосов
/ 13 декабря 2018

Единственное решение вашей проблемы, которое я знаю, состоит в том, чтобы убедиться, что в вашем заголовочном файле нет (неявно) определенных конструкторов или деструкторов для A.Минимальный пример будет выглядеть следующим образом:

(заголовочный файл)

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

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

void foo() {
   A a;
}

Чем бы у вас был файл .cpp где-нибудь, который определил бы (мог бы по умолчанию) конструктор и деструктор для Aи включите определение для класса Data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...