C++ 错误:初始化结构实例的向量数组成员

Posted

技术标签:

【中文标题】C++ 错误:初始化结构实例的向量数组成员【英文标题】:C++ error: Initialise a vector array member of a struct instance 【发布时间】:2015-08-19 11:15:50 【问题描述】:

我有一个结构如下:

typedef struct

    vector<int[6]> swaps;
    int score;
State;

然后我将其实例化

State s1;
int s1arr[]=1,2,3,4,5,6;
s1.swaps.push_back(s1arr); //this is line number 164 in the error
s1.score=23;

下面的所有内容都是一个巨大的错误。除了位置之外,我在任何地方都找不到类似的错误(不是在堆栈溢出时也没有得到答复)。当我推回 s1.swaps 时发生错误。如果有人能帮我找出错误,我将不胜感激

错误日志

In file included from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\vector:69:0,
                 from SessionOrganizer.h:13,
                 from SessionOrganizer.cpp:7:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\vector.tcc: In instantiation of
'void std::vector<_Tp, _Alloc>::_M_insert_aux(std::vector<_Tp, _Alloc>::iterator
, const _Tp&) [with _Tp = int [6]; _Alloc = std::allocator<int [6]>; std::vector
<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<int (*)[6], std::vector<i
nt [6]> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = int (*)[6]]':
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_vector.h:913:28:   required
from 'void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = in
t [6]; _Alloc = std::allocator<int [6]>; std::vector<_Tp, _Alloc>::value_type =
int [6]]'
SessionOrganizer.cpp:164:33:   required from here
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\vector.tcc:329:19: error: array
must be initialized with a brace-enclosed initializer
    _Tp __x_copy = __x;
                   ^
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\vector.tcc:335:16: error: invali
d array assignment
    *__position = __x_copy;
                ^
In file included from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c+
+allocator.h:33:0,
                 from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\allocator.
h:46,
                 from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\string:41,
                 from SessionOrganizer.h:10,
                 from SessionOrganizer.cpp:7:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ext\new_allocator.h: In instantiation
 of 'void __gnu_cxx::new_allocator<_Tp>::construct(__gnu_cxx::new_allocator<_Tp>
::pointer, const _Tp&) [with _Tp = int [6]; __gnu_cxx::new_allocator<_Tp>::point
er = int (*)[6]]':
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ext\alloc_traits.h:216:9:   required
from 'static void __gnu_cxx::__alloc_traits<_Alloc>::construct(_Alloc&, __gnu_cx
x::__alloc_traits<_Alloc>::pointer, const _Tp&) [with _Tp = int [6]; _Alloc = st
d::allocator<int [6]>; __gnu_cxx::__alloc_traits<_Alloc>::pointer = int (*)[6]]'

c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_vector.h:906:34:   required
from 'void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = in
t [6]; _Alloc = std::allocator<int [6]>; std::vector<_Tp, _Alloc>::value_type =
int [6]]'
SessionOrganizer.cpp:164:33:   required from here
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\ext\new_allocator.h:130:9: error: par
enthesized initializer in array new [-fpermissive]
        ::new((void *)__p) _Tp(__val); 
         ^
Makefile:2: recipe for target 'all' failed

【问题讨论】:

数组不可复制或分配,因此它们不能真正用于vector 你为什么要用 C++ 写typedef struct ... State;?这是不必要和不正当的。改写struct State ...;即可。 @JonathanWakely 因为这种蹩脚的语句在 C 语言中很常见,我认为它是专门设计用于在 C++ 中更难使用 C api。 @Slava,但包含 std::vector 的结构不能是有效的 C,因此 OP 没有理由在这里这样做。 @JonathanWakely 我不证明这种使用是合理的,我只是解释了这种结构的来源。我同意你的观点,而且我认为这种结构也应该在 C 中被禁止。 【参考方案1】:

您不应该将C array 存储在向量中,它既不可复制,也不可移动,也不可分配。如果可以使用 C++11,则可以使用 std::array,否则可以使用 boost::array。您也可以只使用std::vector&lt;std::vector&lt;int&gt; &gt;

vector<array<int, 6> > swaps;

【讨论】:

由于某种原因我不能使用 c++11,我更喜欢使用数组而不是向量来节省一些调整大小的时间来优化代码。我想我会坚持使用向量的向量然后 @AkashRupela 你应该使用boost::array 或者只是定义你自己的array。只需template&lt;typename T, size_t N&gt; struct array T x[N]; ;。然后添加您需要的任何方法,例如T&amp; at (size_t i) return x[i]; 【参考方案2】:

std::vector 在内部对其元素进行赋值,这不是为数组定义的。您的错误中有趣的部分是:

错误:无效的数组赋值

如果你写,你会得到同样的错误:

int nn[10];
int nn2[10];
nn = nn2;

这给出了:

main.cpp:21:8: error: invalid array assignment
     nn = nn2;
        ^

所以要么使用vectorvector-s 要么使用vectorstd::array-s

【讨论】:

【参考方案3】:

由于你不能使用c++11,要么像其他人建议的那样使用boost::array,要么使用向量的向量,并使用数组来初始化内部向量。

这是向量解决方案的向量 - 它的结构与您想要的相似。

#include <vector>

struct State 
    std::vector<std::vector<int> > swaps;   // Note the space betweeen the 
                                            // angle brackets due lack of c++11
    int score;
;

int main(int argc, char** argv)

    int s1arr[] = 1, 2, 3, 4, 5, 6;
    State s1;
    s1.swaps.push_back(
        std::vector<int>(s1arr,                                       // Start of s1arr 
                         s1arr + sizeof(s1arr) / sizeof(s1arr[0])));  // End of s1arr

诚然,这不像您最初的那样干净,但是,可以按如下方式使其更干净(如果您不介意将数组提供给构造函数):

#include <vector>

struct State 
    std::vector<std::vector<int> > swaps;
    int score;

    // Default constructor so you can still use the old way
    State ;

    // Constructor which will take an array and create the vector
    template<size_t N>
    State(const int (&array)[N]) 
    
        swaps.push_back(std::vector<int>(array, array + N));
    
;

int main(int argc, char** argv)

    int s1arr[] = 1, 2, 3, 4, 5, 6;
    State s1(s1arr);          // Creates swaps vector

    // Print out the internal swaps vector
    for (int i = 0; i < s1.swaps[0].size(); ++i) 
        std::cout << s1.swaps[0][i] << "\n";
    

【讨论】:

以上是关于C++ 错误:初始化结构实例的向量数组成员的主要内容,如果未能解决你的问题,请参考以下文章

C++静态结构体数据成员的初始化

C++ 未初始化的结构成员 - 字段不存在

C++ 如何将一个静态结构体数组初始化?

小白学习C++ 教程五C++数据结构向量和数组

运行时在构造函数中初始化向量类成员——C++

在 C++ 中操作向量时出现分段错误