2013-09-27 3 views
0

제 코드가 제 3 자 라이브러리와 충돌합니다. 나는 이것을 정의 :글로벌 연산자 + 충돌 체크 대체

inline __m128 operator + (__m128 a, __m128 b) 
{ 
    return _mm_add_ps(a, b); 
} 

하지만 제 3 자 라이브러리를 변경할 수 없습니다 그들은 정의 된 같은이 연산자를 식별 아무것도로 #define하지 않는

error C2084: function '__m128 operator +(const __m128,const __m128)' already has a body 

얻을. 누구나 자신의 정의가 승리 할 수 ​​있다는 것을 알고있는 방법 (아마도 SFINAE 사용)이 있습니까?

+3

먼저 * 왜 * 충돌이 보이나요? 그리고 가정한다면, 이것은 어리석은 질문처럼 보일 수 있습니다. 그러나 처음에 그것을 제공한다면 이것을 구현하려고하는 이유는 무엇입니까? – WhozCraig

+0

그들은 동일하기 때문에 충돌합니다. 괜찮습니다. 그들의 것과 똑같은 일을합니다. 해당 라이브러리는 선택 사항이므로 사용하지 않으면 헤더에 정의 된 재정의가 필요합니다. –

답변

2

해당 연산자를 정의하려는 이유는 무엇입니까? 형식이 __m128 인 라이브러리가 정의되지 않아야합니까?

연산자는 실제로 인수 유형의 인터페이스의 일부입니다. 외부 당사자가 정의하지 않아야합니다 (이 경우 ). SFINAE은 템플릿을 적용하기 때문에

SFINAE는, 적어도 직접 거기에 당신을 도울 수, 그리고 당신이 정말로이 템플릿을 원하지 않는다 (당신이 을 위해 어떤 유형을 operator+를 제공하지 않으려는, 당신은?). 충분한 노력을하면 작동하는 것처럼 보이지만 컴파일러가 라이브러리에있는 연산자의 정의를 소스 코드의 해당 형식과 함께 +을 사용할 때마다 볼 수 있는지 여부에 달려 있습니다.

연산자가 일부 유스 케이스에 링크 된 라이브러리에 정의되어있는 경우 #ifdef을 사용하여 연산자의 정의를 래핑하고 define을 사용하여 작성시 연산자가 정의되었는지 여부를 제어 할 수 있습니다 .

+0

불행히도 __m128은 파생 될 수없는 내장 컴파일러 유형입니다. 나는 그것을 정의하는 라이브러리를 사용할 때 필자는 수동으로 내 오버라이드를 주석 처리하지만, 라이브러리가 사용되지 않으면 다시 수동으로 활성화해야합니다. –

+0

끌기입니다 –

관련 문제