2013-06-20 2 views
5

У меня есть структуры данных и процессор класса для данных, данные укладываются без указателей для быстрее SIMD обработки:C++ не может помещать данные в вектор

struct trajectory_data { 
    float position[3]; 
    float velocity[3]; 
    float acceleration[3]; 
    ... 
}; 

class trajectory_processor{ 
private: 
    vector<trajectory_data> tdata; 
    vector<trajectory_data> default_data; 
    ... 
}; 

Но я не на самом деле добавить набор данных для вектора, ни одна из этих работ:

trajectory_processor::trajectory_processor(){ 

    // gives error: no match for ‘operator=’ in ... 
    trajectory_data d0(); 
    default_data[0] = d0; 

    // gives error: no matching function for call to 
    // ‘std::vector<trajectory_data>::push_back(trajectory_data (&)()) 
    trajectory_data d1(); 
    default_data.push_back(d1); 
}; 

Согласно push_back reference и C++ vector push_back я предположил, что это должно быть легко, но даже после нескольких поисков Google я просто не могу найти ответ.

Этот проект включает кросс-кодирование в html/javascript, и я, кажется, ударяю о стену, как этот, каждый раз, когда я переключаюсь обратно на C++, он начинает на мне на нервы.

+4

Я могу ошибаться, но я думаю, что это тонкий C++ ошибка анализа с линии trajectory_data d0() ;. Это интерпретируется как объявление функции с функцией, называемой d0 и возвращающей trajectory_data. Попробуйте удалить(). –

ответ

8

Вы, кажется, быть жертвой Most Vexing Parse. В принципе, линия

trajectory_data d1(); 

фактически объявить функцию d1, который не принимает никаких аргументов и возвращает trajectory_data объект.

Изменение его

trajectory_data d1; 

должен решить вашу проблему, то же самое для d0. Конструктор по умолчанию будет вызываться в любом случае, нет необходимости в ().

+1

Хотя, если вы полагаетесь на инициализацию значения, вам нужно будет изменить его на 'trajectory_data d1 = trajectory_data();' или 'trajectory_data d1 {};' если вы можете использовать C++ 11. –

+0

@MikeSeymour, хороший пункт! –

+0

Спасибо, думаю, я не должен был пробовать это после четырех часов сна. Вы просто не позволили кодеру отказаться от C++ и перейти к node.js :) – havarc

0

Изменение trajectory_data d0(); в trajectory_data d0;

Первый объявляет функцию d0, который не принимает никаких аргументов и возвращает trajectory_data.
Второй явно и явно создает экземпляр trajectory_data под названием d0.

Это также относится и к trajectory_data d1();