2017-05-10 2 views
0

Je me demandais quelle était la syntaxe appropriée pour créer des méthodes de classe non typées. J'ai essayé ceci, mais apparemment cela ne fonctionne pas:Méthodes avec paramètres de modèle non-type

class A 
{ 
    enum B 
    { 
     C = 0, 
     D 
    }; 
    template <A::B value = A::C> 
    int fun(); 
}; 

template<A::B value> 
int A::fun<A::B::C>() 
{ 
    return 1; 
} 

template<A::B value> 
int A::fun<A::B::D>() 
{ 
    return fun<B>() + 1; 
} 

Qu'est-ce que je fais mal?

Répondre

1

Vous tentez de spécialiser partiellement des modèles de fonction, ce qui n'est pas autorisé. Voici un extrait compilable:

class A 
{ 
    enum B 
    { 
     C = 0, 
     D 
    }; 
    template <A::B value = A::C> 
    int fun(); 
}; 

template<> 
int A::fun<A::B::C>() 
{ 
    return 1; 
} 

template<> 
int A::fun<A::B::D>() 
{ 
    return fun<B::C>() + 1; 
} 
2

Le problème est que votre syntaxe de spécialisation est incorrecte. Il tente une spécialisation partielle d'une fonction, mais cela n'a même pas de sens ici - et n'est pas autorisé de toute façon.

Vous essayez également d'appeler fun<B>() dans la deuxième spécialisation, mais B est un nom de type et non une valeur de l'énumération, de sorte que l'appel ne peut pas être résolu.

Essayez ceci:

// Removed template argument to make a complete specialization instead of partial. 
template<> 
int A::fun<A::B::C>() 
{ 
    return 1; 
} 

// Removed template argument to make a complete specialization instead of partial. 
template<> 
int A::fun<A::B::D>() 
{ 
    // Changed template argument from B (which is a type) to C (which is a value of 
    // type B. 
    return fun<C>() + 1; 
}