2013-08-07 3 views

답변

1

귀하의 operator T()와 함께 x,y,z로 초기화 된 T의 목록을 반환합니다. 즉, DoSomething의 오버로드는 2 개의 벡터를 사용하는 오버로드 또는 벡터를 사용하는 오버플로와 double* 사이에서 모호합니다.

호출 사이트에서 두 번째 인수를 원하는 형식으로 변환하면 컴파일러에게 어떤 과부하를 가져올 지 명시 적으로 알려줍니다.

std::enable_if은 기본적으로 3 개의 double을 사용하여 구성 가능하지 않은 오버로드를 제거합니다. 즉, 모호성을 제거하므로 컴파일됩니다.

귀하의 벡터는 구성 가능합니다 (double 세 개).

Vector(double x, double y, double z) 
+0

배열은 어디에 있습니까? 그것은 단지'double *'을 직접 수행하는 변환을 선택하지 않습니까? (인스턴스화하면 실패하지만 과부하 해결은 이미 이전에 오류가 발생했기 때문에 인스턴스화되지 않습니다)? – hvd

+1

배열? 허 ....? –

+0

답장에서 붕괴를 편집하고 다시 넣었습니다. 다시 넣어서는 안됩니다 :) 다른 과부하를 제거하고 암시 적 변환을'double *'으로 강제 실행하면 작동하지 않습니다. 'double * '로의 변환은 불가능합니다. 'enable_if'가있는 것과없는 유일한 차이점은 발견 될 때입니다. – hvd

1

enable_if이 없으면 모든 유형의 변환 연산자가 있습니다. {x, y, z}에서 구성 할 수없는 유형의 변환 연산자를 인스턴스화하려고 시도하면 오류가 발생하지만 연산자가 존재한다는 사실은 변경되지 않습니다. 존재하기 때문에 형식은 double *으로 변환 될 수 있으며 과부하 해결 방법은 최상의 일치 항목을 선택할 수 없습니다.

관련 문제