2011-12-16 2 views
3

이 이음새는 MSVC10의 버그일까요?클래스 템플릿의 구성원 템플릿 기능에 대한 enable_if

#include <type_traits> 

template<int j> 
struct A{ 
    template<int i> 
    typename std::enable_if<i==j>::type 
     t(){} 
}; 

int main(){ 
    A<1>().t<1>(); //error C2770 
} 

오류 C2770 : 잘못된 명시 적 template_or_generic 인수 (들) "enable_if :: A 형 : t (무효)".

다음 컴파일 :

#include <type_traits> 

template<class j> 
struct A{ 
    template<class i> 
    typename std::enable_if<std::is_same<i,j>::value>::type 
     t(){} 
}; 

template<unsigned int j> 
struct B{ 
    template<unsigned int i> 
    typename std::enable_if<i==j>::type 
     t(){} 
}; 

int main(){ 
    A<int>().t<int>(); 
    B<1>().t<1>(); 
} 
+1

g ++ 및 clang ++에서 작동합니다. '#include '와'std :: enable_if'를 사용 했습니까? – kennytm

+0

예 .......... 12 –

+1

무엇이 오류입니까? 게시물 "작동하지 않는". "일하지 않는다"는 것은 무엇을 의미합니까? 컴파일되지 않습니까, 아니면 뭐죠? – Nawaz

답변

1

이은에 관해서 결정을 할 수없는 MSVC2010의 부분에 약간의 이상한 행동 것으로 보인다 여부 템플릿 매개 변수가를 그대로 < 1>의 사용 int 기반 템플릿의 인스턴스화.

나는 위의 코드를 컴파일 할 때, 나는 다음, 자세한 오류 :

error C2770: invalid explicit template argument(s) for 
    'std::enable_if<i==1>::type A<j>::t(void)' 
    with 
    [ 
     j=1 
    ] 
    d:\programming\stackoverflow\stackoverflow\stackoverflow.cpp(11) : 
    see declaration of 'A<j>::t' 
    with 
    [ 
     j=1 
    ] 

이 0 당신의 1 개 값을 바꿀 경우, 당신이 여전히 작동하지 않는 것을 발견,하지만 당신은 어떤을 사용하는 경우 다른 유효한 int, 서식 파일을 꽤 행복하게 컴파일 할 나타납니다.

내가 왜 이런 일 완전히 모르겠지만, 템플릿 매개 변수를 나타 내기 위해 CONST의 int를 사용하여이 코드가 작동 할 수 있습니다 :

template<int j> 
    struct A{ 
     template<int i> 
     typename std::enable_if<i == j>::type 
      t(){} 
    }; 

    int main(){ 

     const int j = 1; 
     const int i = 1; 

     A<j>().t<i>(); //now compiles fine 
    } 

내 의심이에 따라 컴파일러이다 템플릿 인스턴스화와 관련하여 0과 1을 모호하게 사용합니다. 다행히도이 문제를 해결할 수있는 방법은 Google을 통해이 문제에 걸림돌이되는 사람에게 유용합니다 ...

관련 문제