【问题标题】:error 2552: Non-aggregates cannot be initialized with initializer list错误 2552:无法使用初始化列表初始化非聚合
【发布时间】:2019-05-05 12:53:27
【问题描述】:

我正在尝试使用以下代码初始化标头中的向量,但出现错误

C2552:“标签”:非聚合不能用 初始化列表。

我查到原因是VS2010不支持C++11初始化列表。

如何在VS2010中初始化向量?

const int CLEAN = 0;
const int TARGET = 1; 
const vector<int> LABELS = { CLEAN, TARGET };

【问题讨论】:

  • 您可以考虑升级您的 IDE/编译器,而不是坚持使用已有十年历史的东西。
  • g++ 没有问题:Live Demon on coliru 可能是 VS2010 的弱点。
  • 可能是,一个“中间”数组可能是一种解决方法:Live Demo on coliru(但我手头没有 VS2010 来检查它......)
  • 你可以通过一个简单的卸载解决VS2010的所有问题。
  • 显式推回每个值?

标签: c++ visual-studio-2010 vector initialization


【解决方案1】:

这应该可以。至少,是纯C++98

const int CLEAN = 0;
const int TARGET = 1;
const int LABELS_N = 2;
int LABELS_A[LABELS_N] = { CLEAN, TARGET};
const std::vector<int> LABELS(LABELS_A, LABELS_A+LABELS_N);

我还建议您将其他项目包含在命名空间中:

namespace detail {
    const int LABELS_N = 2;
    int LABELS_A[LABELS_N] = { CLEAN, TARGET};
}
const std::vector<int> LABELS(detail::LABELS_A, detail::LABELS_A+detail::LABELS_N);

另一种选择是使用初始化器类,尤其是当您有许多这样的全局常量时:

namespace detail {
    struct Initializer
    {
        Initializer()
        {
            LABELS.push_back(CLEAN);
            LABELS.push_back(TARGET);
        }
        std::vector<int> LABELS;
    };
    const Initializer initializer;
}
const std::vector<int>& LABELS = detail::initializer.LABELS;

是的,如果您不升级编译器,您可能会遇到更多问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2020-03-18
    相关资源
    最近更新 更多