双[2]错误的向量

时间:2010-06-22 21:55:42

标签: c++ arrays vector typedef

为什么会出现这个错误:

#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]’

如何解决?

5 个答案:

答案 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)来包含双精度。