G ++ 4.8.2坚持简单的变量成员是数组

时间:2015-05-28 14:03:50

标签: c++ gcc

只有使用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;
};

不能重现问题。

这里可能出现什么问题?我是否认为这不是我的错?

1 个答案:

答案 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 = { }

作品。好事我不想要任何非零值...