вектор двойной [2] ошибки - PullRequest
2 голосов
/ 23 июня 2010

почему эта ошибка:

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

9 голосов
/ 23 июня 2010

Вы не можете этого сделать. Как уже упоминалось, массивы нельзя копировать или присваивать, что является требованиями для std::vector. Я бы порекомендовал это:

#include <vector>
struct point {
    double x;
    double y;
};

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

В любом случае он будет читаться лучше, так как вы можете делать такие вещи, как:

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

, что делает это более очевидным, этот вектор содержит точки (координаты?)

4 голосов
/ 23 июня 2010

Единственный способ решить эту проблему - перестать пытаться делать то, что вы пытаетесь сделать.Массивы нельзя копировать или назначать.

Честно говоря, я даже не знал, что вы можете попытаться сделать что-то подобное.Похоже, что компилятор, черт возьми, по сути, черт возьми.Это меня не удивляет.Я не знаю точно, почему, но я знаю, что это просто никогда не сработает.

С другой стороны, вы сможете без труда содержать boost :: array.

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

Вы должны заглянуть в документацию, чтобы убедиться, что я прав, но я уверен, что этот тип можно назначать и создавать копии.

2 голосов
/ 23 июня 2010

Просто, чтобы дать альтернативное решение, вы также можете использовать пару double:

#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));
}

Но, вероятно, лучшим решением будет названная точка или структура.

0 голосов
/ 23 июня 2010

Используйте класс массива struct или static, например boost :: array, чтобы содержать двойные числа.

0 голосов
/ 23 июня 2010

Я не вижу здесь проблем. Возможно, обновленный 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$ 
...