문제

꽤 많은 시간이 내 코드를 디버깅 한 후에는 Enable_if를 사용하여 예기치 않은 템플릿 전문화 결과에 대한 내 문제가 발생한 이유를 추적했습니다.

다음 코드는 Visual Studio 2010 (및 2008)에서 dotest ()에서 어설 션이 실패하고 있으며 G ++ 3.4.5가 아닙니다. 그러나 someclass 에서 템플릿을 제거하거나 my_condition someclass 밖으로 이동합니다.

는 작동합니다.

이 코드 가이 동작 (적어도 부분적으로) 설명하는이 코드가 잘못되었거나 MSVC 컴파일러의 버그입니까?

(이 예제 코드 사용)

부스트 및 C ++ 0x STL 버전에 대해 동일합니다.
#include <cassert>
#include <boost\utility\enable_if.hpp>

template <class X>
class SomeClass {
public:
    template <class T>
    struct my_condition {
        static const bool value = true;
    };

    template <class T, class Enable = void> 
    struct enable_if_tester { 
        bool operator()() { return false; }
    };

    template <class T>
    struct enable_if_tester<T, typename boost::enable_if< my_condition<T> >::type> { 
        bool operator()() { return true; }
    };

    template <class T>
    void DoTest() {
        enable_if_tester<T> test;
        assert( test() );
    }
};

int main() {
    SomeClass<float>().DoTest<int>();
    return 0;
}
.


STD :: ENABLE_IF를 사용할 때이 조건을 옮길 때도 충분하지는 않지만 적어도 BOOST :: ENALL_IF :

에서 작동하는 것도 충분히 작동하지 않는다는 점을 알아 차렸다.
#include <cassert>
//#include <boost\utility\enable_if.hpp>
#include <type_traits>

template <class T, class X>
struct my_condition {
    static const bool value = true;
};

template <class X>
class SomeClass {
public:
    template <class T, class Enable = void> 
    struct enable_if_tester { 
        bool operator()() { return false; }
    };

    template <class T>
    //struct enable_if_tester<T, typename boost::enable_if< my_condition<T, X> >::type> { 
    struct enable_if_tester<T, typename std::enable_if< my_condition<T, X>::value >::type> { 
        bool operator()() { return true; }
    };

    template <class T>
    void DoTest() {
        enable_if_tester<T> test;
        assert( test() );
    }
};

int main() {
    SomeClass<float>().DoTest<int>();
    return 0;
}
.

누군가 가이 설명에 대해 설명하기를 바랍니다.

도움이 되었습니까?

해결책

모든 것이 당신의 코드로 괜찮습니다. VC는 버그가 있습니다.템플릿 멤버 클래스의 부분 템플릿 전문화에 문제가있는 것으로 알려져 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top