只有使用g ++ 4.8.2 for ARMv6(stock pidora)才会出现此问题;它在x86_64 w / clang 3.4.2和g ++ 4.8.3上编译时没有错误或警告。我很难将其视为编译器错误,但希望得到其他一些意见。
它涉及一个简单的成员变量,g ++保持坚持是一个数组和
error: array must be initialized with a brace-enclosed initializer
该类的标题如下所示:
namespace SystemStateMonitor {
class ramInput : public input, public inputFile {
public:
typedef enum {
RATIO,
PERCENT,
KiBYTES,
MiBYTES
} style_t;
ramInput (
const std::string &label = "RAM",
style_t style = style_t::PERCENT
);
unsigned int getAvailable ();
double getDV ();
double ratio ();
protected:
style_t style;
unsigned int available;
void setStyle (style_t);
friend input* jsonInputRAM (jsonObject);
};
}
构造函数如下所示:
#define PROC_FILE "/proc/meminfo"
using namespace std;
using namespace SystemStateMonitor;
ramInput::ramInput (
const string &label,
ramInput::style_t s
) :
input (label),
inputFile (PROC_FILE),
style (s),
available (0)
{
setStyle(style);
}
当我使用ARMv6 g ++编译它时,我得到:
inputs/ramInput.cpp:19:14: error: array must be initialized with a brace-enclosed initializer
available (0)
^
超类没有任何“可用”成员;没有潜在的奇怪碰撞。有趣的是,如果我然后修改构造函数:
) :
input (label),
inputFile (PROC_FILE),
style (s)
{
available = 0;
setStyle(style);
}
我现在得到style (s)
的相同错误。如果我然后用style
做同样的事情(将初始化移动到正文中),我得到inputFile (PROC_FILE)
的错误,这更奇怪,因为这是一个超级构造函数调用
inputs/ramInput.cpp:17:22: error: array must be initialized with a brace-enclosed initializer
inputFile (PROC_FILE)
^
不幸但不足为奇的是,SSCCE从此开始:
class test {
public:
test () : x(0) { };
unsigned int x;
};
不能重现问题。
这里可能出现什么问题?我是否认为这不是我的错?
答案 0 :(得分:3)
正如Mike Seymour在评论中指出的那样,错误的级联性质表明编译器只是指向问题初始化列表的结尾,而不是正确的条目。结果证明该数组是超类构造函数的默认初始值设定项:
std::array<double,2> range = { 0 }
那个特定的g ++扼杀了它,并且:
std::array<double,2> range = { 0.0, 0.0 }
可是:
std::array<double,2> range = { }
作品。好事我不想要任何非零值...