2011-07-26 2 views
1

Je souhaite écrire une classe en C++ dans laquelle l'un des paramètres est bitset<size>. Je veux donner la possibilité de varier cette "taille" pour n'importe quel objet de cette classe mais devrait être constant pour cet objet.Problème pour la classe de modèle <class_name> qui a un bitset comme argument

Si je fais une variable const int size; et l'initialiser dans le constructeur, il ne compile pas parce que writiting bitset<size> nécessiterait size être statique qui rendrait même pour tous les objets de la classe.

Existe-t-il une autre méthode que de créer un modèle de classe et de lui donner la taille classname<size>?

merci mais .. mais cela rend ces objets de classe Foo chaque fois qu'ils sont utilisés en tant que composition (objet comme membre de données) ... serait-il nécessaire de faire à nouveau ce modèle de classe. J'ai fait une classe et Passé un (#define BIT_SIZE 16 à Foo bits;) il donne des erreurs de compilation référence indéfinie à Foo < 16> :: Foo(). où Foo() est le constructeur. Je pensais que cela devrait fonctionner parce que c'est aussi le temps de compilation. et je voulais juste faire seulement des bits de taille BIT_SIZE. devrais-je faire mon modèle de classe "niveau suivant" ?? il se peut que ces erreurs aient été causées par d'autres erreurs. mais j'ai vérifié encore et encore.


oui monsieur, je l'ai mis en œuvre et que, mais inclus les fichiers d'en-tête et pas les fichiers cpp .......... quand je l'ai changé ces fichiers cpp ... plusieurs erreurs de déclaration est intervenue. Je travaille sur Linux Ubuntu .. quand j'ai pris ces fichiers à dev_cpp dans les fenêtres qui ont fonctionné. peut-être parce que le compilateur a fait automatiquement ce que je dois faire. alors qu'est-ce que je dois faire.

+0

Quelle est cette conversation dans votre question? À qui répondez-vous? –

Répondre

1

Non, il n'y a pas d'autre méthode, parce que le code pour l'instanciation réelle pour bitset<N> est généré au moment de la compilation, vous n'avez donc aucune possibilité de retarder la fourniture de sa taille avant l'exécution. Vous devez utiliser le paramètre de modèle non-type.

Si c'était possible, les créateurs de la bibliothèque C++ standard l'auraient fait et il serait possible de fournir la taille pour bitset à l'exécution, non? L'utilisation d'une autre implémentation de jeu de bits est une option.

1

Pour utiliser le membre bitset, vous devez faire size un paramètre de modèle et l'utiliser dans le membre:

template <size_t N> 
class Foo 
{ 
    std::bitset<N> thebitset; 

public: 
    Foo() /* ... */ 
}; 

ensuite de l'utiliser, par exemple Foo<12> x;.

Compte tenu de votre question des alternatives, vous pouvez utiliser un moteur d'exécution dynamique au lieu d'un tableau statique: paramètre

class Bar 
{ 
    std::vector<unsigned char> thedata; 

public: 
    explicit Bar(size_t n) : thedata(n, 0) { } 

    inline unsigned char & operator[](size_t i) { return thedata[i]; } 
    inline const unsigned char & operator[](size_t i) const { return thedata[i]; } 
}; 
+0

merci mais .. c'est ok pour l'utiliser.mais cela rend ces objets de classe Foo utilisés comme composition (objet comme membre de données) ... serait-il nécessaire de faire à nouveau ce template de classe. J'ai fait une classe et Passé un (#define BIT_SIZE 16 à Foo bits;) il donne des erreurs de compilation référence indéfinie à Foo <16> :: Foo(). où Foo() est le constructeur. Je pensais que cela devrait fonctionner parce que c'est aussi le temps de compilation. et je voulais juste faire seulement des bits de taille BIT_SIZE. devrais-je faire mon modèle de classe "niveau suivant" ?? il se peut que ces erreurs aient été causées par d'autres erreurs. mais j'ai vérifié que –

+0

j'ai même donné la valeur par défaut à BITS_SIZE dans Foo

+0

"undefined refrence" n'est pas une erreur de temps de compilation, c'est une erreur de lien. Avez-vous implémenté le constructeur? –

2

de modèle doit être compilable constante de temps; le compilateur va générer différentes classes pour différents paramètres de taille. Si vous souhaitez utiliser une seule classe de bitset pour différentes tailles possibles utilisent alors, par exemple, Boost dynamic_bitset:

http://www.boost.org/doc/libs/1_47_0/libs/dynamic_bitset/dynamic_bitset.html

et passer la taille de bitset en tant que paramètre constructeur

+0

merci pour la réponse rapide .. –

Questions connexes