2013-05-02 2 views
2

기본 이동 구성자가 작성되지 않은 MSVC 컴파일러에 알려진 버그가 있습니다.std :: std :: unique_ptr을 stl 컨테이너로 이동합니다. (MSVC 컴파일러 문제)

std::vector<std::unique_ptr<User>> users; 
{ 
    // I use this logic often (create a temporary object and move it into stl container 
    auto new_user=make_unique<User>(); 
    users.push_back(std::move(new_a)); 
} 
users.back()->FirstName="Should"; 
users.back()->LastName="Work"; 

std::cout << "First Name: " << users.back()->FirstName << std::endl; 
:이 같은 수업을하고이 시나리오에서 작동 할 무언가로 변환 어떻게

struct User { 
    std::string FirstName; 
    std::string LastName; 
    std::string Address; 
    std::string PostalCode; 
    std::string City; 

    std::vector<std::unique_ptr<ProjectBase>> Projects; 
}; 

을 :

문제는 내가 이것에 유사 클래스의 여지가있다

위 코드는 Windows Phone 8에서 작동하지 않지만 (이동 생성자가 없기 때문에) Visual Studio 2012 (v110) 툴킷으로 작동합니다.

Windows Phone 8에서 작동 할 수 있도록 이동 생성자가있는 경우 내 사용자 클래스는 어떻게 생겼을까요?

+2

'push_back (make_unique ())'을 수행하는 대신에'make_unique'라는 변수 폼을 만드는 이유가 있습니까? –

+0

'User (User &&) = default;'시도 했습니까? –

+1

@VaughnCato : MSVC는 아직 지원하지 않습니다. –

답변

4

간단하게 각 구성원의 이동 생성자를 호출 할 std::move 전화 :

또한
User(User&& u) 
    : FirstName(std::move(u.FirstName)), 
    LastName(std::move(u.LastName)), 
    Address(std::move(u.Address)), 
    PostalCode(std::move(u.PostalCode)), 
    City(std::move(u.City)), 
    Projects(std::move(u.Projects)) 
{} 

make_unique<User>();를 사용하여, 당신은 또한 사용자 정의의 ctor, 즉 User(){}가 필요합니다.

+0

나는 많은 수준의 상속을 가진 50 개 이상의 클래스를 가지고 있습니다. 다른 방법이 있습니까? – Grapes

+0

@ 포도 : 표시된 코드에 이동 코드가 필요합니다. 컴파일러는 생성하지 않으므로 명시 적으로 정의해야합니다. 그렇지 않으면 유일한 다른 선택은 이동 코드가 필요한 코드를 피하는 것입니다. –

+2

@Grapes 지루하다.하지만 아마 몇 시간 밖에 걸리지 않을 것이다. VS를 암시 적으로 생성하지 않도록 VS를 가정합니다. 그것은 인생을 매우 어렵게 만듭니다. 추가 할 경우 이동 할당 연산자도 추가하십시오. – David

관련 문제