gpt4 book ai didi

c++ - 包含和前向声明都出错

转载 作者:行者123 更新时间:2023-11-30 05:22:30 26 4
gpt4 key购买 nike

我正在开发一个使用 Apache Xerces 的庞大代码库。我正在使用 clang++ 构建代码,但出现错误。

在一个特定的 .h 文件 a.h 中,a.cpp 的头文件中,类属性的头文件的前向声明和包含如下 -

#include <xercesc/sax2/Attributes.hpp>

namespace XERCES_CPP_NAMESPACE{
class Attributes;
}

文件xercesc/sax2/Attributes.hpp有代码

XERCES_CPP_NAMESPACE_BEGIN
...<some code>...
class SAX2_EXPORT Attributes {
...<some code>...
}
...<some code>...
XERCES_CPP_NAMESPACE_END

使用 clang 构建代码时出现的错误是

a.cpp:45:39: error: member access into incomplete type 'const obixercesc_2_8::Attributes'
a.h:20:10: forward declaration of 'obixercesc_2_8::obixercesc_2_8::Attributes'
class Attributes;

这是 a.cpp 中引发错误的相应行

void f(const XERCES_CPP_NAMESPACE::Attributes& attrs) {
/* this line ---> */ const XMLCh * pAppName = attrs.getValue(X("appName"));

但是当我注释掉前向声明并在 a.h.当我使用 g++ 而不是 clang++ 时,代码也在构建。

我不明白一些事情 -

1) 当既有前向声明又有包含时,为什么不使用 clang++ 构建?

2) 为什么错误指向 obixercesc_2_8::Attributes,而不是 XERCES_CPP_NAMESPACE::Attributes,类属性的实际命名空间?

3) 为什么用g++编译代码?

最佳答案

与其说这是一个解决方案,不如说是一个假设,但无论如何,这是一个想法。

出于某种原因,您正在转发声明 Attributes错误地在嵌套命名空间中 obixercesc_2_8::obixercesc_2_8 , 当你指的是 obixercesc_2_8::Attributes , CLang 选择你的前向声明而不是 Xerces 的实现,因为它们不在同一个命名空间中(可能是因为 using namespace 语句?)。从它的角度来看,您有两个 Attributes 的声明。 , 一个在 obixercesc_2_8和一个 obixercesc_2_8::obixercesc_2_8 . XERCES_CPP_NAMESPACE似乎是一个扩展为 obixercesc_2_8 的宏.

关于c++ - 包含和前向声明都出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39631805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com