关于c ++:double [2]错误的向量

vector of double[2] error

为什么会出现这样的错误:

1
2
3
4
5
6
7
#include <vector>
typedef double point[2];

int main()
{
     std::vector<point> x;
}
1
2
3
4
5
6
/usr/include/c++/4.3/bits/stl_construct.h: In function ‘void std::_Destroy(_Tp*) [with _Tp = double [2]]:
/usr/include/c++/4.3/bits/stl_construct.h:103:   instantiated from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator = double (*)[2]]
/usr/include/c++/4.3/bits/stl_construct.h:128:   instantiated from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator, std::allocator&) [with _ForwardIterator = double (*)[2], _Tp = double [2]]
/usr/include/c++/4.3/bits/stl_vector.h:300:   instantiated from ‘std::vector::~vector() [with _Tp = double [2], _Alloc = std::allocator]
prova.cpp:8:   instantiated from here
/usr/include/c++/4.3/bits/stl_construct.h:88: error: request for member ‘~double [2]’ in ‘* __pointer’, which is of non-class type ‘double [2]

如何解决?


你不能那样做。如前所述,数组不可复制或分配,这是std::vector的要求。我建议这样做:

1
2
3
4
5
6
7
8
9
#include <vector>
struct point {
    double x;
    double y;
};

int main() {
     std::vector<point> v;
}

不管怎样,它都会读得更好,因为你可以做如下的事情:

1
put(v[0].x, v[0].y, value);

这使得向量包含点(坐标?)更加明显。


唯一能解决这个问题的方法就是停止做你想做的事。数组不可复制或分配。

老实说,我甚至不知道你能做这种事。看来编译器基本上是在把事情搞得一团糟。这并不让我吃惊。我不知道确切原因,但我知道这根本不起作用。

另一方面,您应该能够轻松地包含boost::数组。

1
typedef boost::array<double,2> point;

您应该查看文档以确保我是正确的,但我非常确定这种类型是可分配的和可复制构造的。


为了给出一个替代的解决方案,您还可以使用一对double:

1
2
3
4
5
6
7
8
9
10
#include <vector>
#include <utility>

typedef std::pair<double, double> point;

int main()
{
    std::vector<point> x;
    x.push_back(std::make_pair(3.0, 4.0));
}

但是名为point的结构或类可能是最好的解决方案。


使用结构或静态数组类(如boost::array)来包含双精度数。


我觉得这里没问题。也许更新的gcc(glibc)可以解决这个问题?

1
2
3
4
5
6
    shade@vostro:~$ ls /usr/include/c++/
    4.4  4.4.3
    shade@vostro:~$ cd ~/Desktop
    shade@vostro:~/Desktop$ g++ test.cpp
    shade@vostro:~/Desktop$ ./a.out
    shade@vostro:~/Desktop$