2012-05-06 3 views
6
다음 코드는 GCC-4.5.1 컴파일

하지만 비주얼 스튜디오 (11)비주얼 스튜디오 (11) 컴파일 타임 오류가 사용하는 표준 : :지도

#include <map> 
#include <array> 

typedef std::pair<const unsigned int, std::array<const unsigned int, 4>> pairus; 

int main(){ 

    std::map<const unsigned int, std::array<const unsigned int, 4> > x; 
    std::array<const unsigned int, 4> troll = {1, 2, 3, 4}; 
    x.insert(pairus(1, troll)); 

    auto z = x[1]; 
} 

1은 이제 std::array<> troll에 매핑됩니다. 삽입이 잘 작동하고 프로그램이 컴파일됩니다.

error C2512: 'std::array<_Ty,_Size>::array' : 자료 없음 적절한 기본 생성자

은 무엇 원인> 따라서 그 1을 맵 트롤 배열을 얻기 위해 노력하고, 다음과 같은 오류와 함께 컴파일되지 않는 프로그램이 - 그러나, 곧 내가 auto z = x[1] 시도로 gcc와 vs11 사이의 이러한 동작 차이와이를 수정하는 방법은 무엇입니까?

감사합니다.

+0

'pairus'는'make_pair'가 아니십니까? (당신의 문제라고 생각하지 마십시오.) – Corbin

+0

그래, 페어 스가 std :: pair <> 타입으로 잘 작동합니다. 이 이상한 컴파일러 동작은 나를 괴롭 히고 있습니다. – ScarletAmaranth

+0

페어 런스는 어떻게 보이나? (사용자 정의 함수라고 가정하거나 make_pair의 MSVC++ 별명입니까?) 나는 당신이 게시 한 코드 어디에서나 기본 생성자가 필요하지 않기 때문에 문제가 페어 루스에 있다고 의심한다. (k가지도에없는 x [k]를 할 경우 기본 ctor가 필요할지라도) – Corbin

답변

4

대신 auto z = *x.find(1);을 시도하십시오. [] - 운영자는 기본 구성 가능한 유형이 필요합니다. 실제로 컨테이너 전체에는 기본 구성 가능한 유형이 필요하므로 다양한 구현을 시도하면서 무작위 적으로 만 기대할 수는 없습니다.

+0

당신은 천재예요! :) 작동합니다! :) Gcc는 마 법적 마술을 알고있는 것 같습니다. 고마워;) – ScarletAmaranth

+0

C++ 11이 전달되었으므로 기본 생성자 요구 사항이 전체 컨테이너를 나타내는 지 확실하지 않습니다. 새 맵은 이동 가능한 유형을 보유 할 수 있어야하지만 일부 기능 만 사용할 수 있습니다. 연산자가 생각하지 않습니다. –

3

유형에 상수가 포함되어있어 유형을 할당 할 수 없습니다.

x [1]은 (는) 할당 할 수있는 참조를 반환하려고 시도합니다. 키가 아직 존재하지 않으면 빈 값을 구성합니다. 이 두 가지 모두 귀하의 유형에 유효하지 않습니다. 대신 find를 사용해야합니다.

+0

왜 지구상에서 gcc가 다음과 같은 것을 컴파일합니까? – ScarletAmaranth

+0

표준에는 필요한 내용 만 나와 있으며 허용되는 내용은 나와 있지 않습니다. gcc 구현이 작동하는 몇 가지 방식은 특별한 경우에 동일한 문제를 일으키지 않습니다. 이 일은 무료입니다. 진단 요구 사항은 없습니다. –