2014-04-11 3 views
0

в .h:Нет необходимости конструктор по умолчанию доступен в структуры с GLM векторами

enum collisionType {AB, BA, AoverB, AunderB}; 

struct Collision { 
public: 
    collisionType type; 
    glm::vec2 point1; 
    glm::vec2 point2; 

    Collision(enum collisionType, glm::vec2, glm::vec2); 
}; 

в .cpp:

Collision::Collision(enum collisionType collisType, glm::vec2 p1, glm::vec2 p2) : type(collisType), point1(p1), point2(p2) 
{ 

} 

не используя его

std::vector<Collision> collisions; 

glm::vec2 point1(11.0, 12.0); 
glm::vec2 point2(12.0, 13.0); 

collisions.push_back(Collision(AoverB, point1, point2)); 

Получение ошибки C2512: «Столкновение ': нет подходящего конструктора по умолчанию, почему?

+0

Фрагмент над компиляцией очень хорошо на g ++. Вы уверены, что не используете 'Collision a? 'Или smth где-нибудь? –

ответ

1

Вы можете прочитать here требования к типу T, который хорошо подходит для std::vector.
По умолчанию-конструктив не указан.

Я также попытался компиляции этого минимальный пример кода, в котором X не имеет конструктор по умолчанию, и это нормально компилируется с MSVC:

#include <vector> 

struct X { 
    X(int a, int b) : A(a), B(b) {} 
    int A; 
    int B; 
}; 

int main() { 
    std::vector<X> v; 
    v.push_back(X(10,20)); 
} 

Таким образом, проблема должна быть в другом месте в коде.

Во всяком случае, вы можете добавить конструктор без аргументов, чтобы сделать ваш Collission класс «по умолчанию-конструктивны», и сделать компилятор счастливым:

struct Collision { 

    // Default constructor. 
    // Initialize data members to some init values. 
    Collision() { 
     ... 
    } 

PS Заметьте, что struct в C++ эквивалентен class { public: ..., поэтому вы можете опустить строку public: в свой код: это подразумевается использованием ключевого слова struct.

+0

В нем ничего не говорится о построении по умолчанию. Только CopyAssignable и CopyConstructible, или MoveAssignable и MoveConstructible с C++ 11. –

+0

@BlazBratanic: Спасибо, я обновил свой ответ. Я также тестировал, что std :: vector и push_back кажутся корректными с классами, которые не являются конструктивными. Проблема ОП должна быть в другом месте. –

0

Следующий код компилируется отлично, это что-то еще, что является проблемой.

#include <glm/vec2.hpp> 
#include <vector> 

enum collisionType {AB, BA, AoverB, AunderB}; 

struct Collision { 
public: 
    collisionType type; 
    glm::vec2 point1; 
    glm::vec2 point2; 

    Collision(enum collisionType, glm::vec2, glm::vec2); 
}; 

Collision::Collision(enum collisionType collisType, glm::vec2 p1, glm::vec2 p2) : type(collisType), point1(p1), point2(p2) 
{ 

} 

int main() 
{ 
    std::vector<Collision> collisions; 

    glm::vec2 point1(11.0, 12.0); 
    glm::vec2 point2(12.0, 13.0); 

    collisions.push_back(Collision(AoverB, point1, point2)); 
} 

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

  • Нет связанных вопросов^_^