2016-10-10 1 views
0

에 클래스를 삽입 할 때 나는지도 variables.insert(make_pair("foo", new Int(10)))에 데이터를 삽입하려고하지만, 나는 다음과 같은 오류를 얻고있다 :C는 + + - 오류가 난 그렇게 <code>map<string, unique_ptr<Base>> variables</code> 같은지도가지도

error: no matching function for call to ‘std::map<std::__cxx11::basic_string<char>, std::unique_ptr<Base>>::insert(std::pair<const char*, Int*>)’ variables.insert(make_pair("test", new Int(10)));

error: no type named ‘type’ in ‘struct std::enable_if<false, void>’ template<typename _Pair, typename = typename

내가 난이 보는 눈의 신선한 쌍을 필요가 있다고 생각

class Base { 
public: 
    Base() {}; 
    virtual ~Base() {}; 
}; 

class Int : public Base { 
public: 
    Int(int i) { 
     this->i = i; 
    } 
    Int operator=(int i) { 
     this->i = i; 
    } 
    int i; 
}; 

void set() { 
    map<string, unique_ptr<Base>> variables; 
    variables.insert(make_pair("test", new Int(10))); 
} 

:

이 내 코드입니다 이 문제가 무엇인지 잘 모르겠습니다. 감사합니다.

나는 이종지도를 만들기 위해 노력하고있어 각 데이터 유형에 대한 클래스가있다

편집. 하지만 얼마나 많은 사람들이 있더라도 여전히 같은 오류가 발생합니다.

+3

게시물 [MCVE]하시기 바랍니다. 함수 본문 외부의 문은 유효하지 않은 구문입니다. –

+0

'static_cast <>'도 도움이 될 수 있습니다. –

+0

코드에서 이러한 오류가 발생하지 않습니다. http://coliru.stacked-crooked.com/a/893f119bceb7514d – aschepler

답변

0

참고 :

  • GCC :이 답변은 세 가지 주요 컴파일러의 이전 버전에 적용 5.3.1 이전 버전에 적용됩니다. 6.1.0 이전 버전에도 적용 할 수 있지만 테스트하지는 않았습니다.
  • Clang : 3.7.1 이전에 적용됩니다. 3.8.0 이전 버전에도 적용 할 수 있지만 테스트하지는 않았습니다.
  • Visual Studio : 19.00.23506.0 또는 이전 버전에 적용됩니다. 19.00.23720.0 이전 버전에도 적용 할 수 있지만 테스트하지는 않았습니다.

반대로 GCC 6.1.0 이상, Clang 3.8.0 이상 또는 Visual Studio 19.00.23720.0 이상을 사용하는 경우 원본 코드는이 코드에서 제안 된 수정없이 그대로 컴파일해야합니다. 대답.

[감사는 GCC & 연타 이후 버전에서 작동한다는 지적에 대해 AndyG로 이동합니다.]


문제는 당신 unique_ptr 원시 포인터에서 생성되지 않는다는 것으로 보인다.

C++ 14를 사용할 수있는 경우 std::make_unique()을 시도하십시오. 당신은 다음과 같은 것을 시도 할 수없는 경우

void set() { 
    map<string, unique_ptr<Base>> variables; 
    variables.insert(make_pair("test", make_unique<Int>(10))); 
} 

는 :


void set() { 
    map<string, unique_ptr<Base>> variables; 
    variables.insert(make_pair("test", unique_ptr<Int>(new Int(10)))); 
} 
흥미롭게도, 나는 다른 컴파일러가이 문제를 처리하는 방법에 약간의 차이가 나타났습니다. 테스트 프로그램으로 코드의 다음 약간 수정 된 버전을 사용 : 초기 라인이 주석 및 수정 중 하나가 주석이 아닌

#include <map> 
#include <memory> 
#include <iostream> 

class Base { 
public: 
    Base() {}; 
    virtual ~Base() {}; 
}; 

class Int : public Base { 
public: 
    Int(int i) { 
     this->i = i; 
    } 
    Int& operator=(int i) { 
     this->i = i; 

     // You forgot to return something. 
     return *this; 
    } 
    int i; 
}; 

void set() { 
    using namespace std; 

    map<string, unique_ptr<Base>> variables; 
    variables.insert(make_pair("test", new Int(10))); 

    // C++14: 
// variables.insert(make_pair("test", make_unique<Int>(10))); 

    // C++11: 
// variables.insert(make_pair("test", unique_ptr<Int>(new Int(10)))); 

    // Cheap hack for testing. 
    cout << static_cast<Int*>(variables["test"].get())->i << endl; 
} 

int main() { 
    set(); 
} 

대부분의 컴파일러는 * 실패하는 것은,이 컴파일합니다. 그러나 online MSVC compiler은 줄을 주석 처리하지 않아도 제대로 컴파일 할 수있는 것처럼 보였습니다. 흥미롭게도 MSVC available on Rextester 버전은 두 줄 중 하나의 주석을 제거하지 않고 컴파일하지 못했습니다.

*

TutorialsPoint GCC, MSVC 2015 online로, 온라인 테스트 및 Rextester Clang, GCCMSVC.

+0

문제는 원시가 아닙니다. 바늘. 고유 포인터에는 소유권을 갖는 생성자가 있습니다. [데모] (http://coliru.stacked-crooked.com/a/6402b39d91ce7328) 문제는 OP가 우리에게 모든 세부 사항을 제공하지 않았다는 것입니다. – AndyG

+0

@AndyG 이상한. 귀하의 링크와 MSVC 온라인을 제외하고는 여전히 저에게 도움이되지 않습니다. 예를 들어 [Ideone] (http://ideone.com/hIeTQZ)과 같이 링크에서 직접 코드를 복사 해 보았습니다. TutorialsPoint & Rextester GCC와 동일한 오류가 발생합니다. –

+0

그래서 내가 명시 적으로 포인터를 만들 것을 제안했는데, 이것은 어떤 이유로 대부분의 컴파일러가 공유 한 것이라고 생각했습니다. –

관련 문제