2017-07-07 1 views
0

Je suis novice en C++, et j'essaye d'écrire un template supplémentaire qui contient type char ou type int. Après cela, je veux utiliser ce modèle dans un autre modèle pour sélectionner le type de données, en fonction du remplissage des données d'entrée.Utilisation de typedef dans les spécialisations de template

template <bool isPadding> 
class PaddingTemplate; 

template <> 
class PaddingTemplate<false> 
{ 
public: 
    typedef char Type; 
}; 

template <> 
class PaddingTemplate<true> 
{ 
public: 
    typedef int Type; 
}; 

template <class T, bool Padding = ((sizeof(T) % sizeof(int)) == 0)> 
class ObjectComparator 
{ 
private: 
    typedef  PaddingTemplate<Padding> PaddingTrick; 
    typename PaddingTrick::Type   DataType; 

    DataType Shadow[sizeof(T)/sizeof(DataType)]; 
}; 

Je reçois cette erreur du compilateur

Compiler msg

Comment résoudre le problème et d'automatiser le choix du type de données en fonction de remplissage de données?

Répondre

4

DataType n'est pas réellement un type. C'est une instance de PaddingTrick::Type, c'est pourquoi la ligne suivante vous donne une erreur. Vous devez faire:

typedef typename PaddingTrick::Type DataType; 
+0

Merci beaucoup! Ça a marché! Pourriez-vous expliquer plus comment la combinaison de typenamef et typedef fonctionne dans ce code? – Ilia

+1

@Ilia, tout 'typename' signifie que le nom dépendant que vous recherchez est un type: il peut s'agir d'une valeur ou même d'un modèle. Si vous utilisez 'typename Class :: type data', cela signifie que vous voulez construire un objet de ce type. 'typedef typename Class :: type type' signifie que vous voulez un alias. Pour savoir pourquoi 'typename' est nécessaire, voici une excellente réponse: https://stackoverflow.com/a/8584507/4131059 –

+0

Quel langage de programmation cool С ++! Merci encore et un grand salut de la Russie! – Ilia