none
msvs2012 -> 2015 마이그레이션 후 error C2338 에러 RRS feed

  • 질문

  • 안녕하세요, msvs2012 에서 만든 프로젝트를 2015에서 오픈해 컴파일을 했습니다.

    vcredist_x86.exe도 설치도 했습니다. 그런데 error C2338 에러가 발생되는데 문제가 뭘까요?

    C:\Program Files\Microsoft Visual Studio 14.0\VC\include\xmemory0(665): error C2338: The C++ Standard forbids containers of const elements because allocator<const T> is ill-formed. (compiling source file ..\..\..\Reinforce\RAlgorithm\RArranger\CRAAlgorithm.cpp)
    1>  C:\Program Files\Microsoft Visual Studio 14.0\VC\include\xmemory0(883): note: see reference to class template instantiation 'std::allocator<_Ty>' being compiled
    1>          with
    1>          [
    1>              _Ty=const Simulator::StepType
    1>          ] (compiling source file ..\..\..\Reinforce\RAlgorithm\RArranger\CRAAlgorithm.cpp)
    1>  C:\Program Files\Microsoft Visual Studio 14.0\VC\include\vector(450): note: see reference to class template instantiation 'std::_Wrap_alloc<std::allocator<_Ty>>' being compiled
    1>          with
    1>          [
    1>              _Ty=const Simulator::StepType
    1>          ] (compiling source file ..\..\..\Reinforce\RAlgorithm\RArranger\CRAAlgorithm.cpp)
    1>  C:\Program Files\Microsoft Visual Studio 14.0\VC\include\vector(502): note: see reference to class template instantiation 'std::_Vec_base_types<_Ty,_Alloc>' being compiled
    1>          with
    1>          [
    1>              _Ty=const Simulator::StepType,
    1>              _Alloc=std::allocator<const Simulator::StepType>
    1>          ] (compiling source file ..\..\..\Reinforce\RAlgorithm\RArranger\CRAAlgorithm.cpp)
    1>  C:\Program Files\

    .....

    2016년 10월 19일 수요일 오전 11:28

답변

  • 에러 메시지 안에 답이 있는 것 같은데요.

    error C2338: The C++ Standard forbids containers of const elements because allocator<const T> is ill-formed. 

    아마도 CRAAlgorithm.cpp 파일에서 vector<const Simulator::StepType> 타입의 컨테이너를 사용하고 있는것 같네요.

    vector 컨테이너 원소 타입은 내부적인 동작을 위해 대입 연산이 가능해야 합니다.

    그런데 const T 타입은 대입 연산이 불가능하기 때문에 이러한 오류가 발생하는 것으로 보이네요.

    const 제한자를 제거하고 사용해도 된다면 그렇게 하시고, 아니면 const T* 를 사용하던가 하는 방향으로 우회하셔야 겠네요.

    2016년 10월 20일 목요일 오전 12:18