2012-03-27 12 views
6

Eventuali duplicati:
How to use enable_if to enable member functions based on template parameter of classboost :: enable_if_c non sembra funzionare

ho un modello di classe:

template<typename T, size_t N> class Vector 

voglio consentire costruttori per specifiche N, quindi faccio:

Vector(typename boost::enable_if_c<N==2, T>::type const &e0, T const &e1) { 
    data[0] = e0; 
    data[1] = e1; 
} 

Ma il compilatore (MSVC 2010 SP1) mi dà un errore invece di applicare SFINAE. L'errore è:

error C2039: 'type' : is not a member of 'boost::enable_if_c<B,T>' 
     with 
     [ 
      B=false, 
      T=float 
     ] 

Qual è il problema? È un problema noto? Come posso ripararlo? È l'unica soluzione per utilizzare static_assert?

Edit: GCC non riesce neanche: http://ideone.com/7Ejo8

+0

Puoi pubblicare un SSCE su ideone (e mostrarlo compilare correttamente su gcc)? –

+0

@Ben Voigt: GCC non lo compila neanche. –

+0

@Vlad Lazarenko: Ma non è descritto molto bene come risolverlo. –

risposta

5

Non è possibile utilizzare enable_if per consentire/non consentire le funzioni di membro sulla base di parametri di modello della classe: enable_if può essere applicato solo su modelli di funzione o di classe.

Nel tuo caso, l'unica soluzione che posso pensare è la specializzazione dell'intera classe, utilizzando enable_if o più semplicemente con una specializzazione parziale. Puoi mettere i membri comuni in una classe base comune, per evitare di ripetere:

#include <cstdio> 

template<typename T, std::size_t N> 
struct VectorCommon 
{ 
    std::size_t size() { return N; } 
    void add(T const & element) { } 
}; 

template <typename T, std::size_t N> 
struct Vector : VectorCommon<T, N> 
{ 
}; 

template <typename T> 
struct Vector<T, 2> : VectorCommon<T, 2> 
{ 
    Vector(T const & e0, T const & e1) {} 
}; 

int main() 
{ 
    //Vector<int, 100> v100(12, 42); // compile error 

    Vector<char, 2> v2('a', 'b'); // ok 
} 
Problemi correlati