【问题标题】:Initialize a two dimensional array in C++ [duplicate]在C++中初始化一个二维数组[重复]
【发布时间】:2015-10-24 15:45:23
【问题描述】:

我正在学习 C++,但遇到了问题。我在类头文件中有这个声明:

double bgal[3][3] =
    { { -0.066988739415,-0.872755765852,-0.483538914632 },
    { 0.492728466075,-0.450346958020, 0.744584633283 },
    { -0.867600811151,-0.188374601723, 0.460199784784 } };

使用 Visual Studio 2015 可以正常编译,但使用 Visual Studio 2013 则无法编译。我收到这条消息:

cannot specify explicit initializer for arrays

我认为问题与 Visual Studio 2013 不支持 C++11 和编译器错误 C2536 有关。

我试图在类构造函数中移动该初始化,但它不起作用。这个:

MyClass::MyClass() : bgal { { -0.066988739415, -0.872755765852, -0.483538914632 }, 
                            { 0.492728466075, -0.450346958020, 0.744584633283 },
                            { -0.867600811151, -0.188374601723, 0.460199784784 } }

但它不起作用。

有什么建议吗?也许我不能使这个向量保持不变或静态,或者......

我尝试过bgal[0][0] = { ...}; bgal[0][1] = { ...};,但工作量很大。

这不是问题Error: cannot specify explicit initializer for array 的重复,因为该问题询问的是一维数组,并且它提供了一个解决方案来使用bgal[0][0] = { ...}; bgal[0][1] = { ...}; 初始化数组,这需要大量工作。我问是否有另一种方法可以更快地做到这一点。

在寻找可能的重复问题之前,请仔细阅读问题。

【问题讨论】:

  • 您是否必须为 VS2013 显式设置编译器设置才能启用 C++11?
  • @BartoszPrzybylski 请阅读我的更新。我在问我之前发现了这个问题,它的解决方案就在我的问题上,我在问是否还有其他解决方案。
  • @MrLister 我将在虚幻引擎中使用这个库,我不确定是否可以启用 C++ 11。我会检查一下。正如微软所说,我不需要做任何特别的事情来在 Visual Studio 2013 中启用 C++ 11 功能,因此它不支持显式数组初始化。
  • @VansFannel 还有这个问题:stackoverflow.com/questions/19877757/… 似乎指出这是一个VS bug O_o
  • @BartoszPrzybylski std::array 是否等同于双 bgal[3][3] 数组?

标签: c++ arrays c++11 visual-studio-2013


【解决方案1】:

来自 cmets 的继续讨论,并根据这个问题:Workaround for error C2536: cannot specify explicit initializer for arrays in Visual Studio 2013

你可以使用这样的东西,尽管它不如原始数组或数组漂亮

array<array<double, 3>, 3> a({
    array<double,3>({ -0.066988739415,-0.872755765852,-0.483538914632 }),
    array<double,3>({ 0.492728466075,-0.450346958020, 0.744584633283 }),
    array<double,3>( { -0.867600811151,-0.188374601723, 0.460199784784 }) });

为了让它更漂亮一点,你总是可以定义一个辅助宏

#define DD array<double,3>

array<array<double, 3>, 3> a({
    DD({ -0.066988739415,-0.872755765852,-0.483538914632 }),
    DD({ 0.492728466075,-0.450346958020, 0.744584633283 }),
    DD( { -0.867600811151,-0.188374601723, 0.460199784784 }) });
#undef DD

您总是可以尝试使用带有初始化列表的向量向量,如下所示:https://ideone.com/lQ12a4

vector<vector<double> > a{
    { -0.066988739415,-0.872755765852,-0.483538914632 },
    { 0.492728466075,-0.450346958020, 0.744584633283 },
    { -0.867600811151,-0.188374601723, 0.460199784784 } };

我不知道这是否适用于您的编译器,但根据此:https://msdn.microsoft.com/en-US/library/hh567368.aspx 应该。

【讨论】:

  • 该数组是否等同于 bgal[3][3]?在我的代码中,我使用 for (i = 0; i
  • 它是等价的,你的代码应该可以工作,因为 std::array 有正确定义的 operator[],但你不能直接转换为 double[][]
  • 我在我的头文件中使用了你的代码,我得到了很多错误。我必须在哪里使用您的代码?
  • @VansFannel 什么样的错误?要使用 std::array 你需要包含 header
  • at a({ ({
【解决方案2】:

这是一个演示程序,显示了数组类型的数据成员初始化。您可以选择允许使用编译器初始化数组的方法。:)

#include <iostream>

struct A
{
    double bgal[3][3] 
    { { -0.066988739415,-0.872755765852,-0.483538914632 },
      { 0.492728466075,-0.450346958020, 0.744584633283 },
      { -0.867600811151,-0.188374601723, 0.460199784784 } 
    };    
};

struct B
{
    B() : bgal { { -0.066988739415,-0.872755765852,-0.483538914632 },
                 { 0.492728466075,-0.450346958020, 0.744584633283 },
                 { -0.867600811151,-0.188374601723, 0.460199784784 } }
    {

    }

    double bgal[3][3];
};

int main()
{
    A a;
    B b;

    for ( const auto &row : a.bgal )
    {
        for ( double x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }

    std::cout << std::endl;

    for ( const auto &row : b.bgal )
    {
        for ( double x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }
}

程序输出是

-0.0669887 -0.872756 -0.483539 
0.492728 -0.450347 0.744585 
-0.867601 -0.188375 0.4602 

-0.0669887 -0.872756 -0.483539 
0.492728 -0.450347 0.744585 
-0.867601 -0.188375 0.4602 

使用在线MS编译器编译

【讨论】:

  • 但是在线编译器不是用vs 2015吗?
  • 如果我按照您在 struct B 中的建议执行操作,我会收到相同的错误消息。
  • @VansFannel 你是否表明你复制并粘贴了我的示例?
  • @Bartosz Przybylski 该示例允许检查特定编译器是否会编译程序。
  • @VladfromMoscow 你能发个这个编译器的链接吗?
猜你喜欢
  • 2021-04-04
  • 2019-02-10
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多