在struct初始化中

时间:2014-12-15 17:16:44

标签: c++ c++11

有些东西让我对C ++感到困惑,我可以这样写:

struct Test {
    double V[3];
}

没有问题,但是当我尝试例如:

struct Test {
    vector<double> V(3);
}

编译器给我一个错误。上面有什么区别,我的意思是为什么不能编译第二个?

而且,这个更令人费解:

struct Test {
    std::vector<double> V[3];
}

至少在我看来应该抛出编译器错误的最后一个例子是由GCC和Clang编译而没有问题。

4 个答案:

答案 0 :(得分:4)

不要混淆初始化和声明。

double V[3];

这声明了一个由三个双精度组成的数组。没问题。没有初始化。

vector<double> V(3);

这声明了一个向量,并尝试通过调用其构造函数3作为参数来初始化它。这里不允许这样的初始化。使用C ++ 11,您可以使用大括号的初始化语法,这是允许的:

vector<double> V{3};

但是,由于vector有一个带initializer_list<double>的构造函数,这将被解释为调用该构造函数,而不是那个带有size_t值(你想要的那个)的构造函数。它将使用单个元素(3.0)初始化向量。您可以将V{0,0,0}用于您想要的内容,但是一旦您需要超过3个值,这可能会变得丑陋。

你的最后一个例子

std::vector<double> V[3];

简单地声明一个由三个向量组成的数组。没有初始化。没问题。

答案 1 :(得分:2)

这些是不同的东西。

第一个声明一个包含三个元素的数组。 [3]是该类型的一部分。

第二个声明了一个向量,然后使用看起来像初始化语法的东西,但在这个特定的上下文中是不允许的。 (3)不属于该类型。 (请注意,在C ++ 11或14中,您可以获得允许类似内容的类内初始值设定项。)

第三个声明了一个由三个向量组成的数组。将语法与第一个语法进行比较:所有更改都是double替换为std::vector<double>

答案 2 :(得分:1)

您想要做的是:

struct Test {
    vector<double> v;

    Test(): v(3) {}
};

使用初始化列表向您的结构添加构造函数,该初始化列表明确地调用带有3作为参数的向量构造函数。

否则无法在声明结构或类成员的上下文中调用构造函数(除了使用大括号使用特定C ++ 11语法的初始化程序列表构造函数)。

更一般地说,固定大小的数组应该使用std::array类,如前所述。

答案 3 :(得分:1)

好像你想要一个固定长度的数组stl类型。 std::vector不是这个。您正在寻找std::array

您可能想要std::array<double, 3>

请注意,如果这不是你的意图。