在定义成员类之后重新声明它是否合法?
Is it legal to re-declare a member class after defining it?
我有一个编译boost的问题。bimap图书馆。我的测试程序是一个空白的主函数,只有一个包含指令(如#include <boost/bimap.hpp>
)。经过一番调查,我发现预处理器从头文件中做出了一些有趣的结构,如:
struct A { struct B{}; struct B; };
我不知道这是否正确,但是gcc接受它,而clang和icc不接受。谁是对的,我可以做些什么来编译程序与bimap库?不幸的是,在这种情况下我不能使用gcc。
struct B{};
定义了一个嵌套类,那么struct B;
是同一个嵌套类的重新声明。
GCC接受代码是错误的(bug报告),因为标准在[class.mem]中说:
在您的例子中,嵌套类是定义然后声明的,这是不允许的,因此Clang和ICC给出诊断是正确的。然而,当我测试它时,他们只给出一个警告,而不是一个错误,所以也许你正在使用成员不能在成员规范中声明两次,除非可以声明嵌套类或成员类模板,然后再定义,
-Werror
,在这种情况下停止这样做,代码应该编译。
Boost中的问题。Bimap代码是一个已知的bug
相关文章:
- 是否可以同时声明一个类成员的常量/非常量?
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- 如果在 2 个线程中使用,是否值得将size_t声明为 std::atomic?
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 专用模板是否需要专用声明?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 声明中不一致的no是否违反ODR?
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- 是否可以使用 using 将基类中的公共成员重新声明为派生类中的私有成员?
- 'this'指针是否可以在 c++ 标头声明中使用?
- 在类内和类外的定义处执行类转发声明是否有区别
- 前向声明时"结构"和"类"关键字是否相同?
- 是否可以在 "if" 语句中声明变量?
- 从模板基类派生是否在派生类声明的点实例化模板
- 在C++/Cython中,是否可以只声明相关属性在Python中可见
- 这个函数是否声明得很好
- 是否声明抽象类型的字段?首选指针或引用
- 我是否声明了部分专门化的友类?-非常困惑
- 为什么程序的成功取决于是否声明了重载构造函数