2010-07-13 4 views
2

je donne les résultats suivants (réduit), qui a travaillé dans VC2005, mais ne fonctionne plus en 2010.VS2010 code C++ membre erreur de spécialisation fonction modèle

template <typename TDataType> 
class TSpecWrapper 
    { 
    public: 
    typedef typename TDataType::parent_type index_type; 


    public: 

    template <bool THasTriangles> 
    void Spec(index_type& io_index) 
     { std::cout << "False version" << std::endl; } 

    template <> 
    void Spec<true>(index_type& io_index) 
     { std::cout << "True version" << std::endl; } 
    }; 

Il semble que lorsque « index_type » est un type dépendant, Je reçois toujours un C2770: erreur de modèle explicite non valide (s) sur la spécialisation. Notez que ce code est en fait suffisant pour générer l'erreur - une main vide est suffisante pour le compiler, le modèle n'a même pas besoin d'être instancié.

Cela fonctionne très bien si index_type n'est pas un type dépendant. Des idées pour lesquelles il en est ainsi dans VC2010, si c'est un comportement standard ou un bug, et si je peux contourner cela?

+0

De quel type vous passer pour le paramètre 'TDataType'? –

+2

Il y a un paramètre 'index_type' et' index', est-ce une faute de frappe? –

+1

duplication possible de [Spécialisation explicite dans la portée sans espace de noms] (http://stackoverflow.com/questions/3052579/explicit-specialization-in-non-namespace-scope) –

Répondre

7

Solution

template <bool v> struct Bool2Type { static const bool value = v; }; 

template <typename TDataType> 
class TSpecWrapper 
{ 
public: 
    typedef typename TDataType::parent_type index_type; 


public: 
    template <bool THasTriangles> 
    void Spec(index_type& io_index) 
    { 
     return SpecHelp(io_index, Bool2Type<THasTriangles>()); 
    } 

private: 
    void SpecHelp(index_type& io_index, Bool2Type<false>) 
    { std::cout << "False version" << std::endl; } 

    void SpecHelp(index_type& io_index, Bool2Type<true>) 
    { std::cout << "True version" << std::endl; } 

}; 
+0

Merci pour ça - ça m'aide à contourner le problème! –

+0

C'est une solution de contournement * TRES * utile! – Vargas

4

C'est selon C++ standard 14.7.3/18:

Dans une déclaration de spécialisation explicite pour un membre d'un modèle de classe ou un modèle de membre qui apparaît portée d'espace de noms, le modèle de membre et certains de ses modèles de classe englobante peut rester non spécialisé, sauf que la déclaration ne doit pas explicitement spécialiser un modèle de membre de classe si ses modèles de classe englobante ne sont pas explicitement spécialisés ainsi. < ...>

Il est interdit de se spécialiser Spec sans se spécialiser TDataType.

+0

Mais ça marche bien si index_type n'est pas un type dépendant (eg int) ... –

+0

En fait, en parcourant les réponses, il semble que VS2005 était très libéral, et 2010 un peu moins libéral, mais encore plus libéral que la norme permet. Donc, je suppose que d'une certaine manière cette question est un doublon de http://stackoverflow.com/questions/3052579/explicit-specialization-in-non-namespace-scope (au moins la réponse à cette question couvre également la mienne) –

Questions connexes