2013-04-19 2 views
1

Clang을 사용하여 MSVC 표준 라이브러리를 컴파일하려고합니다. 그러나 표준 라이브러리가 클래스 범위에서 명시 적 템플릿 함수 전문화를 사용하기 때문에 실패합니다.clang을 사용하여 MSVC std lib을 컴파일합니다. 클래스 범위에서 명시 적 템플릿 함수 전문화

이것은 MS 확장이며 Clang에서 사용할 수없는 것 같습니다.

다음은 MSVS로는 정상적으로 컴파일되지만 Clang에서는 제대로 컴파일되지 않는 간단한 예입니다.

template<class T> 
class A 
{ 
public: 
    A() 
    { 
     foo((T)0, 0); 
    } 

    template<class T2> 
    void foo(T2, void* p) {} 

    template<> 
    void foo<bool>(bool, void* p) 
    { 
     t = (T)p; 
    } 
    T t; 
}; 

int main() 
{ 
    A<bool> a; 
    return 0; 
} 

Clang을 사용할 때이 기능을 사용하려면 어떻게해야합니까? 그러면 MSVC 표준 라이브러리를 컴파일 할 수 있습니까?

warning: explicit specialization of 'foo' within class scope is a Microsoft extension [-Wmicrosoft] 
void foo<bool>(bool, void* p) 

error: expected ';' after expression 
       t = (T)p; 
        ^
        ; 
error: no member named 'T' in 'A<bool>' 
       t = (T)p; 
        ^
+0

궁금한데, 왜 Clang과 MSVC의 라이브러리를 컴파일하고 있습니까? – Pubby

+0

그것은 Clang이 MS 확장이라고 알고있는 것처럼 보입니다. 경고는 단지 그것에 대해서 경고하기 때문에, 올바르게 이해하지 못하기 때문입니다. 'A '이 단지 버그 일 뿐이라고 가정합니다. –

+0

@Pubby, 컴파일하지 않는 MSVC 항목은 프로젝트에 포함 된 헤더 파일에 구현됩니다. 나는 Clang과 함께 컴파일하기 때문에 MSVC가보고하지 않는 많은 유용한 오류와 경고를 제공합니다. – user2080366

답변

0

나는 당신이 세 가지 가능성이있을 거라 생각 :

    하면 해당 확장자를 사용하지 않도록 MSVC 라이브러리를 다시 작성
  1. (재미있을 수있다,하지만 시간이 ... 소모)
  2. 수정이를 MS-확장 이 (어떻게 지루한 ...)

위해 만들어진 컴파일러와 각 라이브러리를 사용 연타에
  • 이 제정신 일을 할 (... 더 많은 재미와 많은 시간이 소요될 수 있습니다) 연타에 대한 this 테스트 코드에서

    업데이트 나는 이미 구현되어 있다고 가정하지만, 명시 적 템플릿 매개 변수를 기대하지 않습니다 아마

    template<> 
    void foo(bool, void* p) 
    { 
        t = (T)p; 
    } 
    

    그것의 그 확장의 연타의 구현에 버그가.

  • +0

    MS 확장을 수정하지는 않지만 클랜에서 확장 기능을 구현하는 것이 좋습니다. D – RedX

    +0

    @RedX 구현 된 것으로 가정합니다. 그렇지 않으면 오류가 아닌 경고가되어야합니다. . 그러나 업데이 트를 참조하십시오;) –

    0

    가 AFAIK 당신이 수준의 범위 내에서 명시 적으로 전문화를 지원하기 위해 연타를 확장해야합니다 :

    내가받을 컴파일 오류입니다. 라이브러리를 수정하고 싶지 않으면 주위에 어떤 방법이 있다고 생각하지 않습니다.

    +0

    더 쉽게 할 수 있을지 궁금하다;) –