【问题标题】:How to fix this array used as initializer error?如何修复此数组用作初始化程序错误?
【发布时间】:2016-05-26 15:01:35
【问题描述】:

保存.cpp

#include "save.h"
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
Save::Save()
{
}

我已经注释了所有函数并从 Save::Save 中删除了竞争,但它不会影响错误。
保存.h

#ifndef SAVE_H
#define SAVE_H
#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;
class Save
{
    public:
        Save();
        void vDisplay();
        char cDecode();
        bool bFileExists(const string& crsFileName);
        const char ccTab = 9;
        const char ccHelp[5] = "help";
        const char ccNo[3] = "no";
        const char ccStart[6] = "start";
        const char ccQuit[5] = "quit";
        const char ccYes[4] = "yes";
};
#endif // SAVE_H

我使用 g++ 4.9 并在 C++11 中编译,它在 save.cpp 的第 6 行给出了这个错误,尽管我已经检查过了,但我是 c++ 新手,不太确定,这是根本不是初始化器。
这似乎是由我希望整个类都可以使用的常量成员的非静态数据成员初始化引起的编译器错误。

【问题讨论】:

  • 请向我们展示您的头文件。
  • 我也认为这应该编译,我很困惑为什么它没有
  • 您实际上不需要指定 const char 数组的大小。一旦你给它们赋值(就像你做的那样),编译器会自动计算它。
  • 无关,但需要#include &lt;string&gt;
  • 您使用的是const string&amp;,因此您需要正确的包含。无论如何,要解决您的问题,请在 C++11 模式下编译。

标签: c++ error-handling g++ g++4.9


【解决方案1】:

错误信息令人困惑。它指向构造函数(实际上甚至没有初始化列表),即使真正的罪魁祸首是这一行(以及它后面的类似行):

const char ccHelp[5] = "help";

GCC manual 表示从 4.7 开始支持该功能,但 4.9 显然无法编译您的程序。这似乎是一个编译器错误。请记住,在 GCC 5.1 之前,C++11 支持是实验性的。 Here 是您的程序重现了 4.9 中的编译器错误,here 是您的程序在 5.1 中编译良好。

因此,您的选择是 1) 升级编译器或 2) 使用更丑陋的初始化形式,这似乎在 4.9 中有效:

const char ccHelp[5] = {'h','e','l','p','\0'}; // ugly :(

作为旁注:您使用了std::string,但您忘记在定义std::string 的地方包含&lt;string&gt;

【讨论】:

  • 为什么每个人都对我使用 string.h 而不是 string 不满意?到目前为止,它似乎工作得很好,所以出了什么问题?
  • @M.Brückmann 除了 Jose 的已删除答案外,没有人提到您对 string.h 的使用。如果您愿意,即使您不使用标题中的任何内容,也可以将其保留在您的代码中。问题是您使用了std::string,但不包括&lt;string&gt;,这是定义std::string 的地方。仅仅因为它恰好可以工作(因为另一个头文件恰好包含&lt;string&gt;),并不意味着它没问题,或者它不会在标准库更改的任何时候停止工作。
  • 我实际上是在包含&lt;string.h&gt;,据我所知,这也是定义std::string 还是我错了?
  • @M.Brückmann 为什么你认为&lt;string.h&gt; 定义了std::string?它没有。
  • 我在哪里听说过。
【解决方案2】:

类内初始化:

const char ccHelp[5] = "help";

仅在 C++11 之后才合法。

【讨论】:

  • 我知道,但你没有回答我的问题。
  • @M.Brückmann 如果您实际上没有使用 C++11,我正在回答您的问题。详情请见stackoverflow.com/questions/26822712/…
  • @M.Brückmann 在你的问题中你从未说过你在 C++11 模式下编译。
  • 我正在使用 C++11,否则我将面临其他问题
  • @Eutherpy 为了消除所有误解,我现在将其包含在我的问题中。
猜你喜欢
  • 1970-01-01
  • 2016-05-05
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多