为什么会出现这个错误:
#include <vector>
typedef double point[2];
int main()
{
std::vector<point> x;
}
/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]’
如何解决?
答案 0 :(得分:9)
你做不到。如上所述,数组不可复制或可分配,这是std::vector
的要求。我会推荐这个:
#include <vector>
struct point {
double x;
double y;
};
int main() {
std::vector<point> v;
}
无论如何它会更好地阅读,因为你可以做以下事情:
put(v[0].x, v[0].y, value);
这使得矢量包含点(坐标?)
更明显答案 1 :(得分:4)
解决这个问题的唯一方法就是停止尝试做你想做的事情。数组不可复制或可分配。
说实话,我甚至都不知道你可以尝试这样做。似乎编译器基本上是吓坏了。这并不让我感到惊讶。我不确切知道为什么,但我确实知道这根本不可行。
另一方面,你应该可以毫无困难地包含一个boost ::数组。
typedef boost::array<double,2> point;
你应该查看文档以确定我是正确的,但我很确定这种类型是可分配的和可复制的。
答案 2 :(得分:2)
只是为了提供替代解决方案,您还可以使用一对双:
#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的结构或类可能是最好的解决方案。
答案 3 :(得分:0)
我认为这里没问题。也许更新的GCC(Glibc)可以解决问题吗?
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$
答案 4 :(得分:0)
使用结构或静态数组类(如boost :: array)来包含双精度。