【发布时间】:2017-10-02 13:34:47
【问题描述】:
[OSX 10.12.6,LLVM Clang ++ 9.0]
我需要将用 C++11(使用初始化列表)编写的库转换为 C++03 形式(或更早版本)。该库是 3D 模型的仅标头实现。在库中,我有一个结构,其中包含许多属性,这些属性本身就是自定义类。
struct BodyPoint {
BodyPoints name;
Point3D<double> orientation;
Point3D<double> offset;
BodyPoint() {}
BodyPoint(BodyPoints _name, Point3D<double> _orientation, Point3D<double> _offset):
name(_name), orientation(_orientation), offset(_offset) {}
};
1) BodyPoints 是一个typedef enum BodyPoints,它列举了我正在控制的对象上的兴趣点。 (在这个库中声明)
2) Point3D
该库提供了一个预定义的 BodyPoints 数组,该数组对于使用它的模块来说是全局的。
所以,在声明结构之后,我声明了一个数组变量。但是,我收到一个错误declaration requires a global constructor [-Werror,-Wglobal-constructors]
我的数组声明如下:
static BodyPoint bodyPoints[2] =
{
BodyPoint(bWorld,Point3D<double>(0.0,0.0,0.0), Point3D<double>(0.00,0.00,0.00) ),
BodyPoint(bHead, Point3D<double>(0.0,0.0,0.0), Point3D<double>(0.00,0.00,0.00) )
};
如何为结构数组创建构造函数,我将在我的代码中的哪个位置执行此操作? (另外,我不想在这里使用向量。)
【问题讨论】:
-
你能提供一个可重现的minimal reproducible example吗?它编译时添加了一些缺失的部分here
-
在这里阅读 Howard Hinnant 的回答:stackoverflow.com/questions/15708411/…
-
@NathanOliver:谢谢,这不是我所期望的。我的代码中唯一的区别是 main、BodyPoint 和 Point3D 位于单独的文件中,并且我使用的是 XCode 9 的 Clang++ 版本。该命令包括标志:
-fblocks -O2 -std=c++11 -stdlib=libc++ -Werror -Weverything -Wno-unknown-pragmas -Wno-weak-vtables -Wno-padded -Wno-unused-variable -Wno-unknown-warning-option -Wno-reserved-id-macro(顺便设置了 C++11,而不是 98)。 [我们的构建设置了这些标志,包括 C++11,但最终出于交叉编译的原因,我需要编写代码以符合 C++03 或更早的标准。] -
@ChrisUzdavinis:我已经看过那个例子了,虽然我不明白应该如何实现使用类引用和构造函数主体的解决方案,但它看起来不适用于我使用结构和数组时的情况。我不想在结构中添加更多属性,也不想将其包装到父类中。
-
@gone 看起来警告是因为你有一个全局对象。如果您要使用全局数组,您应该关闭警告。或者您可以使用自己的
std::array并使用霍华德的解决方法。
标签: c++ arrays struct initialization