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]’ |
如何解决?
你不能那样做。如前所述,数组不可复制或分配,这是
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$ |