有些东西让我对C ++感到困惑,我可以这样写:
struct Test {
double V[3];
}
没有问题,但是当我尝试例如:
struct Test {
vector<double> V(3);
}
编译器给我一个错误。上面有什么区别,我的意思是为什么不能编译第二个?
而且,这个更令人费解:
struct Test {
std::vector<double> V[3];
}
至少在我看来应该抛出编译器错误的最后一个例子是由GCC和Clang编译而没有问题。
答案 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>
。
请注意,如果这不是你的意图。