Pergunta

Depois de algum tempo de depuração do meu código, eu rastreou o motivo para os meus problemas para alguns inesperados especialização de modelo de resultados usando enable_if:

O seguinte código de falha de declaração em DoTest() no Visual Studio 2010 (e 2008), embora não no g++ 3.4.5.No entanto, quando eu remover o modelo de SomeClass ou mover my_condition fora do âmbito da SomeClass ele funciona em MSVC, também.

Há algo de errado com este código que se poderia explicar este comportamento (pelo menos parcialmente) ou este é um bug no MSVC compilador?

(usando este exemplo de código é o mesmo para o impulso e o c++0x versão 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;
}

Ao tentar corrigi-lo, movendo a condição fora do escopo, notei também que isso não é ainda o suficiente quando usando std::enable_if, mas pelo menos ele funciona com o 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;
}

Espero que alguém tem uma explicação para isso.

Foi útil?

Solução

Está tudo bem com o seu código, é só que VC está errado.É conhecido por ter problemas com parciais de especialização de modelo de membro de modelo de classes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top