[c++] 오류 : 삭제 된 기능 사용

친구가 작성한 일부 C ++ 코드를 작업하고 있는데 gcc4.6으로 컴파일 할 때 이전에 본 적이없는 다음 오류가 발생합니다.

error: use of deleted function

GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed:
uninitialized non-static const member const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h

편집 : 이것은 부스트 ​​MSM을 사용하는 코드의 일부에서 비롯됩니다. 부스트 웹 페이지를

Edit2 : 없습니다 = delete() 소스 코드 어디에도 사용 .

일반적으로이 오류는 무엇을 의미합니까? 이러한 유형의 오류가 발생하면 무엇을 찾아야합니까?



답변

오류 메시지는 기본 생성자가 암시 적 으로 삭제되었음을 분명히 나타냅니다 . 그 이유는 다음과 같습니다. 클래스에 기본 ctor에 의해 초기화되지 않는 비 정적 const 변수가 포함되어 있습니다.

class X {
    const int x;
};

이후 X::x입니다 const하지만 (그것이 POD 타입이기 때문에) 디폴트의 ctor는 일반적으로 초기화되지 것 -이를 초기화해야합니다. 따라서 기본 ctor를 얻으려면 직접 정의해야합니다 (그리고 초기화해야합니다 x). 참조 인 멤버로 동일한 종류의 상황을 얻을 수 있습니다.

class X {
    whatever &x;
};

둘 다 본질적으로 동일한 이유로 할당 연산자의 암시 적 생성도 비활성화한다는 점에 주목할 가치가 있습니다. 암시 적 할당 연산자는 일반적으로 멤버 단위 할당을 수행하지만 const 멤버 또는 참조 멤버를 사용하면 멤버를 할당 할 수 없기 때문에 그렇게 할 수 없습니다. 할당 작업을 수행하려면 고유 한 할당 연산자를 작성해야합니다.

이것이 const회원이 일반적으로 으로 정적 입니다. 할당을 할 때 어쨌든 const 멤버를 할당 할 수 없습니다. 일반적인 경우 모든 인스턴스는 동일한 값을 가지므로 모두 동일한 값을 가질 변수의 많은 사본을 갖는 대신 단일 변수에 대한 액세스를 공유하는 것이 좋습니다.

물론 다른 값으로 인스턴스를 만들 수도 있습니다. 예를 들어 개체를 만들 때 값을 전달하므로 두 개의 다른 개체가 두 개의 다른 값을 가질 수 있습니다. 그러나 스와핑과 같은 작업을 시도하면 const 멤버는 스왑되는 대신 원래 값을 유지합니다.


답변

로 표시된 함수를 사용하고 있습니다 deleted.
예 :

int doSomething( int ) = delete;

= delete는 C ++ 0x의 새로운 기능입니다. 이는 컴파일러가 즉시 컴파일을 중지하고 사용자가 해당 함수를 사용하면 “이 함수가 삭제되었습니다”라고 불평해야 함을 의미합니다.

이 오류가 표시되면 함수 선언에서 =delete .

C ++ 0x에 도입 된이 새로운 기능에 대해 자세히 알아 보려면 여기를 확인 하십시오 .


답변

gcc 4.6은 삭제 된 함수의 새로운 기능을 지원합니다.

hdealt() = delete;

기본 생성자를 비활성화합니다.

여기에서 컴파일러는 기본 생성자가 생성 될 수 없다는 것을 분명히 보았고 =delete당신을 위해 그것을 만들었습니다.


답변

추상 클래스에서 상속하고 내 하위 클래스에서 모든 순수 가상 메서드를 구현하지 않을 때이 오류가 발생했습니다.


답변

현재 C ++ 0x 표준에서는 삭제 구문을 사용하여 기본 생성자를 명시 적으로 비활성화 할 수 있습니다.

MyClass() = delete;

Gcc 4.6은이 구문을 지원하는 첫 번째 버전이므로 문제 일 수 있습니다.


답변

gcc 4.6에서 gcc 4.8로 전환하면이 문제가 해결되었습니다.


답변