Странное enable_if поведение с помощью вложенных классов (ошибка компилятора MSVC или функция?)

После некоторого времени, отлаживая мой код, я разыскал причину своих проблем к некоторым неожиданным шаблонным результатам специализации с помощью enable_if:

Следующий код приводит утверждение к сбою в DoTest () в Visual Studio 2010 (и 2008), в то время как это не делает в g ++ 3.4.5. Однако, когда я удаляю шаблон из SomeClass или перемещаю my_condition из объема SomeClass, он работает в MSVC, также.

Есть ли что-то не так с этим кодом, который объяснил бы это поведение (по крайней мере частично), или действительно ли это - ошибка в компиляторе 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;
}

При попытке зафиксировать его путем перемещения условия из объема, я также заметил, что это даже не достаточно при использовании станд.:: enable_if, но по крайней мере это работает с повышением:: enable_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;
}

Я надеюсь, что у кого-то есть объяснение этого.

5
задан mfya 9 July 2010 в 00:42
поделиться

1 ответ

С вашим кодом все нормально, просто VC глючит. Известны проблемы с частичной специализацией шаблонных классов-членов.

5
ответ дан 14 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: