2013-02-14 2 views
0

У меня есть этот массив структуры с некоторыми операторами перегруженныхКак использовать массив struct как индекс для массива struct?

struct xyz 
{ 
    int x; float y; 
}; 

std::vector<xyz> a1,a2,a3; 

Когда я использую это как

a1 [ a2 [ i ] ] = a3 [ i ] 

//by this I mean 

//a1 [ a2 [ i ].x ].x = a3 [ i ].x 
//a1 [ a2 [ i ].x ].y = a3 [ i ].y 

Я получаю эту ошибку "\ OCL6D24.tmp.cl", строка 236: ошибка: выражение должно иметь интегральный или перечисляемый тип

Я использую это в ядре OpenCL. Но эта проблема аналогична обычной программе на C++. Как это решить?

Обновление: Я не думаю, что то, что мне нужно, возможно, особенно в ситуации типа OpenCL. Но я решил проблему. Это был дизайнерский недостаток.

+1

Массивные и векторные индексы являются целыми числами и нет ничего, что могло бы «решить». Может быть, вы хотите 'std :: map'? –

+4

Вы не можете использовать объект 'xyz' как индекс массива (' vector'). Вы имеете в виду 'a1 [a2 [i] .x] = a3 [i];'? – BoBTFish

+0

Я хочу сделать что-то вроде этого a1 [a2 [i] .x] .x = a3 [i] .x; a1 [a2 [i] .y] .y = a3 [i] .y; – ark

ответ

1

std::vector::operator[] принимает size_t как входной сигнал, но вы передаете ему объект xyz. Вот почему ваш компилятор отклоняет ваш код.

Чтобы работать вокруг вашего кода, вы можете перегрузить operator int() неявный объект новообращенного к целому числу:

struct xyz 
{ 
  int x; float y; 
    operator int() 
    { 
    return x; 
    } 
}; 

Но вы должны убедиться, что возвращаемое значение относится к коррекции индекса в векторе.

Или используйте какой-нибудь ассоциативный контейнер, например, std::unordered_map.

+0

Но как насчет поплавковой части. Я также хочу вернуть это (тип преобразован в int), когда он проиндексирован. – ark

+0

Я не могу использовать std :: unordered_map, поскольку он не поддерживается в ядре OpenCL. – ark

+0

На самом деле он принимает 'std :: vector :: size_type', но, в порядке, это то же самое в этом случае. – BoBTFish

1

Для этого вам нужно будет использовать какой-то ассоциативный контейнер. Например, std::map или std::unordered_map (по адресу C++11). std::vector поддерживает индексирование только с использованием интегральных типов (как говорит ошибка).

+0

Вправо. Но я не могу использовать std :: map в моем OpenCL Kernel. – ark

Смежные вопросы