2014-04-11 8 views
0

:없음 적절한 기본 생성자 .H에서

통화 당에서
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) 
{ 

} 

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에 적합하다고 읽을 수 있습니다.
Default-constructible이 목록에 없습니다.

또한 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이 deafult-constructible이 아닌 클래스에서 올바르게 작동하는 것으로 테스트했다. OP의 문제는 다른 곳에 있어야합니다. –

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