2016-06-03 2 views
3

일부 데이터를 std::array에 넣어야하는 코드가 있습니다. 두 개의 배열을 교체하고 그 중 하나를 버려서이 작업을 수행 할 수 있다고 생각했습니다. 코드는 다음과 같습니다.std :: swap이 std :: array와 함께 작동하지 않습니다.

int main() 
{ 
    std::array<double, 10> a; 
    std::array<double, 5> b; 
    /*populate b*/ 
    /*swap them round*/ 
    std::swap(a, b); 
} 

그러나 매우 이상한 컴파일러 오류 (MSVC2013)가 발생합니다.

CashFlows.cpp(27): error C2665: 'std::swap' : none of the 3 overloads could convert all the argument types 
include\exception(502): could be 'void std::swap(std::exception_ptr &,std::exception_ptr &)' 
include\tuple(572): or 'void std::swap(std::tuple<> &,std::tuple<> &)' 
include\thread(232): or 'void std::swap(std::thread &,std::thread &) throw()' 
while trying to match the argument list '(std::array<_Ty,_Size>, std::array<_Ty,_Size>)' 
with 
[ 
    _Ty=double, 
    _Size=0x0a 
] 
and 
[ 
    _Ty=double, 
    _Size=0x05 
] 

나는 이해할 수 없다. std::tuple<> 등은 무엇을해야합니까? 서로 다른 템플릿 인스턴스화만큼

+3

Procrustean 오류 ... –

+0

안녕하십니까. 그 이름을 심각하게 지키려고합니까? 이것은 분명히 밝혀진 좋은 질문입니다. 고맙습니다! – Bathsheba

+1

@KerrekSB : 약간의 재량으로 사전에 연락합니다 ... – Bathsheba

답변

7

객체 ab 근본적으로 다른 유형있습니다.

따라서 인수가 동일한 유형이어야하므로 std::swap에 함께 사용할 수 없습니다.

컴파일러가 적절한 과부하를 찾을 수 없으므로 (보기에 이상하게 보임), 표시되는 오류가 발생합니다.

+0

배열이 같은 크기 여야합니까? –

+3

예. 또는 다른 유형을 사용하는 것을 고려하십시오. 'std :: vector'보다'std :: array'를 고르는 좋은 이유가 있습니까? 'std :: swap'을 사용해야합니까? 나는'std :: array <, 10>'을'std :: array <. 5>'으로 어떻게 대체 할 수 있는지 정말로 이해하지 못한다. – Bathsheba

+0

이 답변은'swap_ranges'에 대해서는 언급하지 않습니다. 유일한 문제는 이중 범위 버전이 아직 존재하지 않아 길이가 다른 배열에 사용하기가 어렵다는 점입니다. 그렇지 않으면'std :: swap_ranges (a.begin(), a.end(), b.begin(), b.end()); –

1

나는 이해할 수 없다. std::tuple<> 등은 무엇을해야합니까?

힌트가있을 때마다 오류 메시지를 조금씩 읽습니다. 컴파일러는 사용 가능한 생성자 선언 가능성이 적합 할 수 나열

이 될 수를

void std::swap(std::exception_ptr &,std::exception_ptr &) 

또는

void std::swap(std::tuple<> &,std::tuple<> &) 

또는

void std::swap(std::thread &,std::thread &) throw() 

당신은 이것 또한 documented here 볼 수 있습니다.

관련 문제