Хранение узлов Decl в Clang AST

Я пытаюсь сохранить все узлы FunctionDecl в векторе, чтобы я мог посетить их в будущем. Вариант использования для входа в функции (например, функция вызывает функцию b, я хочу иметь возможность вызывать VisitDecl на узле функции b)

Хранение всех этих узлов выполняется в HandleTopLevelDecl в ASTConsumer:

std::vector<Decl> vec;

virtual bool HandleTopLevelDecl (DeclGroupRef DG) {
for (DeclGroupRef::iterator i = DG.begin(), e = DG.end(); i != e; ++i) {
Decl *D = *i;
vec.push_back(*D);
}
}

Однако во время компиляции возникает ошибка: «~ Decl» является защищенным членом «clang :: Decl».

Кто-нибудь может пролить свет на это?

2

Решение

Проблема в том, что вы кладете копию Decl экземпляр в ваш массив. Создание и удаление этих объектов является ответственностью другого класса, поэтому вы можете иметь только ссылку на экземпляр.

Вот правильное решение для вашей проблемы:

std::vector<Decl *> vec;

virtual bool HandleTopLevelDecl (DeclGroupRef DG) {
for (DeclGroupRef::iterator i = DG.begin(), e = DG.end(); i != e; ++i) {
Decl *D = *i;
vec.push_back(D);
}
}
1

Другие решения

Других решений пока нет …