Domanda

Dopo un po 'di tempo in debugging del mio codice, ho rintracciato il motivo dei miei problemi a alcuni risultati di specializzazione dei modelli inaspettati utilizzando Abilita_IF:

Il seguente codice fallisce l'asserzione in dotest () in Visual Studio 2010 (e 2008), mentre non è in G ++ 3.4.5. Tuttavia, quando rimuovo il modello da someclass o sposta my_condition fuori dallo scopo di someclass funziona anche a MSVC.

C'è qualcosa di sbagliato in questo codice che spiegherebbe questo comportamento (almeno parzialmente) o è questo un bug nel compilatore MSVC?

(Usando questo codice di esempio è lo stesso per Boost e la versione 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;
}
.


.

Quando si tenta di risolverlo spostando la condizione fuori dalla portata, ho anche notato che non è nemmeno abbastanza quando si utilizza STD :: Enable_IF, ma almeno funziona con 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;
}
.

Spero che qualcuno abbia una spiegazione per questo.

È stato utile?

Soluzione

Tutto va bene con il tuo codice, è solo che VC è buggy.È noto avere problemi con la specializzazione del modello parziale delle classi membri del modello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top