오류 : 삭제 된 기능 사용


121

친구가 작성한 일부 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() 소스 코드 어디에도 사용 .

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


4
그리고 당신이 컴파일하고있는 코드?
ColWhi

나는 오류가 무엇을 의미하는지 더 궁금해하고 있었습니까? 이에 대한 코드도 게시해야합니까?
shuttle87

1
gcc.gnu.org/bugzilla/show_bug.cgi?id=47417 도움이 될 수 있습니다. 또한 boost를 사용하고 있습니까?
ColWhi

@Sasquiha, 네, 부스트 MSM을 사용하고 있습니다.
shuttle87

20
이것이 이러한 유형의 오류에 대한 첫 번째 Google 일치로 표시되기 때문에-여기에서는 그렇지 않지만 이러한 유형의 오류에 대한 가장 일반적인 원인은 클래스에 사용자 지정 생성자를 추가 한 후입니다. 결과적으로 컴파일러는 기본 생성자 생성을 중단합니다. 기본 생성자를 통해 클래스의 인스턴스를 만든 경우이 오류가 나타납니다. 기본 생성자를 명시 적으로 추가하기 만하면됩니다.
SF.

답변:


170

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

class X {
    const int x;
};

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

class X { 
    whatever &x;
};

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

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

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


@Jeffry Coffin : 실제 오류 메시지는 편집으로 게시되었습니다. 초기 오류 메시지는 게시 된 경우에만C++ error: use of deleted function
Alok Save

1
@Als : 미안합니다. 제가 모욕이나 그 명령에 대한 어떤 것도 의도 한 것이 아니라, 현재 이용 가능한 것이 그 대답이 옳지 않다는 것을 명백하게 만들었다는 것을 분명히 했어야했습니다.
Jerry Coffin

문제 없습니다. 단호하게 생각하지 않았습니다 ... 당신의 대답은 환상적이며 상황을 가장 잘 설명합니다. 나에게서 +1 :)
Alok Save

나는 당신이 여기 내 문제로 나를 도울 수있을 것이라고 가정한다 : stackoverflow.com/questions/23349524/…
Saher Ahwal

2
@OllieFord : 상황에 따라 다릅니다. (예를 들어) 해당 필드에 한 값이있는 개체를 해당 필드에 다른 값이있는 다른 개체에 할당하면 어떻게됩니까? 덮어 써야한다면 const가 될 수 없습니다. 이것이 전혀 허용되지 않아야한다면 값은 실제로 유형의 일부일 수 있습니다 (예 : 컴파일 타임에 알려진 경우 템플릿 매개 변수).
Jerry Coffin 2015 년

11

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

int doSomething( int ) = delete;

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

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

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


7
호기심에서 그런 일을하면 언제 도움이 되겠습니까?
Pepe

@Peter : 암시 적 변환을 방지합니다.
R. Martinho Fernandes

7
실제로 "암시 적으로 삭제 되었기 때문에 ..."라고 표시 되며 위의 예는 명시 적입니다.
Georg Fritzsche

@Peter R : 이것이 예인 것 같습니다 : en.wikipedia.org/wiki/…
shuttle87

1
@Downvoter : 실제 오류 메시지가 편집으로 게시되었습니다. 초기 오류 메시지 만 게시되었습니다C++ error: use of deleted function
Alok Save

4

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

hdealt() = delete;

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

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


2

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


1
마찬가지로 public virtual1 단계 기본 클래스에 명시 적으로 삭제 된 기본 생성자가있는 2 단계 기본 클래스에서 파생하여 동일한 결과를 얻었습니다 . 제거하면 virtual모든 메서드를 구현하지 않고도 문제가 해결되었습니다.
Maitre Bart

1

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

MyClass() = delete;

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


Gcc 4.6 is the first version to support this syntax최근에 gcc4.6을 사용하기 시작했기 때문에 이전에 본 적이없는 이유를 설명 할 수있을 것 같습니다.
shuttle87

2
나는 수년간 GCC 4.5에서이 구문을 사용하고 있습니다. 며칠을 의미합니다.
R. Martinho Fernandes

아, GCC 4.6에있는 위임 된 ctor를 생각 했나봐요.
jarmond

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.