C++ 03에서 작업 중이며 C++ 11의 delete
d 기능을 사용할 수 없습니다.컴파일러가 C++에서 암시 적으로 선언 된 복사본 생성자를 고려하지 못하게 함 03
복사 할 수없는 개체를 디자인하려고 시도하고 있으며 해당 클래스에서 암시 적으로 선언 된 복사본 생성자를 고려하지 않도록하고 있습니다. 이것은 내가 개발하고있는 단위 테스트 장치를위한 것입니다.
내가 두 가지 목적을 가지고 생각해 핵심 라이브러리 오브젝트, Root
, 테스트에서 파생 특별한 경우 객체 Branch
. 나는 Fixture
이라는 테스트 픽스처 클래스를 개발하려고하는데, Root
오브젝트와 & 오브젝트를 설정하는 것이 중요하다. 그래서 내가 지금까지 구축 한 내용의 단순화 된 그림입니다 :
(I 정의한 제외 Here is an ideone link 다음과 같은 코드는 내 자신의 noncopyable
)
#include <boost/utility.hpp>
#include <boost/noncopyable.hpp>
class Root
{
};
class Fixture
:
public boost::noncopyable
{
public:
Fixture (Root& root)
:
mRoot (root)
{
}
private:
Root& mRoot;
};
class Branch
:
public Root,
public Fixture
{
public:
Branch()
:
Fixture (*this)
{
}
};
int main()
{
Branch branch;
}
이 결과 컴파일 :
main.cpp: In constructor ‘Branch::Branch()’:
main.cpp:30:23: error: call of overloaded ‘Fixture(Branch&)’ is ambiguous
main.cpp:30:23: note: candidates are:
main.cpp:13:5: note: Fixture::Fixture(Root&)
main.cpp:8:7: note: Fixture::Fixture(const Fixture&)
적어도 하나는 스스로 선언하지 않으면 C++ 03 컴파일러가 Fixture
의 복사 생성자를 암시 적으로 선언하지 못하게 할 수 없습니다.
Fixture (*this)
은 단순히이 복사 생성자를 고려하지 컴파일러를 원하는 :하지만 심지어와 함께 : Branch
의 초기화 목록에 Fixture
을 초기화 할 때
class Fixture
:
public boost::noncopyable
{
public:
Fixture (Root& root)
:
mRoot (root)
{
}
private:
Fixture (const Fixture&);
Fixture (Fixture&);
Root& mRoot;
};
... 컴파일러는 여전히 이러한 private
선언을 고려할 것 . 그것은 내 코와 비 복사 기능에 약간의 냄새의로,
Fixture (static_cast <Root&> (*this))
을 ...하지만 차라리하지 않는 게 좋을 :
난 내 자신에 조금 contorting을 수행하여이 작업을 수행 할 수 의미 에서 Fixture
을 파생 시켜서 내가 무엇을 할거야.
에서 호출 사이트에서 코드를 변경하지 않고이 경우 암시 적으로 선언 복사 생성자를 고려에서 컴파일러를 방지 할 수있는 방법이 있나요 :
Fixture (*this)
은?
- 는 "그것은 불가능하다 ...": 표준 C++ 03 : 12.8/4, "특수 멤버 함수":
클래스 정의가 명시 적으로하지 않는 경우 생성자 복사본을 선언하면 하나가 암시 적으로 선언됩니다.
C++ 11의 삭제 된 기능은 도움이 될까요? 삭제 된 기능은 여전히 과부하 해결에 참여합니다. –
@KerrekSB : 솔직히, 나는 모른다. 당신이 결의안에 참여하는 것이 옳다면, 그들은 도움을주지 않을 것이라고 생각합니다. –
[templated constructor] (http://ideone.com/nHhzEi)이 명확하게 우선해야한다고 생각합니다 ... –