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

StackOverflow https://stackoverflow.com/questions/3209085

Вопрос

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

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

Есть ли что-то не так с этим кодом, который объяснил бы это поведение (хотя бы частично) или это ошибка в компиляторе MSVC?

(используя этот пример код, одинаково для повышения и версии C ++ 0x)

#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 :: 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;
}
.

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

Это было полезно?

Решение

Все в порядке с вашим кодом, это просто, что VC багги.Известно, что проблемы с частичным шаблоном специализация классов шаблонов классов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top