conteneurs et methodes templates, et autres petites questions
1 réponse
Jeremie Fouche
Bonjour, bonjour
But du code (le code est a la fin du post) :
Ranger des tempos dans une trame musicale, et donner le tempo à n'importe
quelle position dans la trame.
La map contient les changements de tempo. Le code n'est pas complet,
notement en ce qui concerne CTrame::SetTempo, mais le propos n'est pas là.
Dans un avenir <tres> proche, je souhaite aussi rajouter des changements
de signature, de partie,... C'est le but de la classe template mapPos.
Le code fonctionne, et le résulat correspond à mes attente, mais... (sinon,
c'est pas drole :)
Questions :
Pourquoi les warnings dus à un typename implicite lors de la création de
l'iterateur dans la fonction template CTrame::GetChange() ?
Par la meme occasion, que signifie typename, car j'ai pas bien compris la
doc :(
Le conteneur map est il bien adapté à ce genre de conception ?
La classe template mapPos est vide, et ca me choque un peu, mais rassurez
moi, ca ne pose aucun problème ?
Les méthodes template CTrame::GetChange() et CTrame::SetChange() ne
doivent elle pas etre plutot des fonctions externes à la classe CTrame ?
Pourquoi le compilateur n'accepte pas que je supprime le commentaire dans
la méthode CTrame::Out(). Si je me suis competement planté, y a t il un
moyen d'utiliser directement la fonction copy(begin, end, ostream_iterator)
dans la méthode template CTrame::Out(mapPos), ou bien faut il que je créé
une fonction template operator<<(ostream os, pair<int,T>) (non testé), ou
bien encore que je dérive un classe de ostream_iterator<pair<int,T>> et une
fonction operator<<(ostream, pair<int,T>) (nom testé nom plus), ou bien je
divague dans les spheres éthérés ?
Bon, je crois que ca suffit pour le moment. Merci pour ceux qui prendront
le soin de me repondre... Aïe, Pas sur la tête, je débute.
#include <iostream>
#include <map>
using namespace std;
bool inRange(int val, int min, int max)
{
return ( (val>=min) && (val<=max) );
}
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Franck Branjonneau
"Jeremie Fouche" écrivait:
But du code (le code est a la fin du post) : Ranger des tempos dans une trame musicale, et donner le tempo à n'importe quelle position dans la trame.
J'ignore ce que sont des tempos et des trames musicales.
La map contient les changements de tempo. Le code n'est pas complet, notement en ce qui concerne CTrame::SetTempo, mais le propos n'est pas là. Dans un avenir <tres> proche, je souhaite aussi rajouter des changements de signature, de partie,... C'est le but de la classe template mapPos.
Signature ? Partie ?
Le code fonctionne, et le résulat correspond à mes attente,
C'est déjà bien.
Questions : Pourquoi les warnings dus à un typename implicite lors de la création de l'iterateur dans la fonction template CTrame::GetChange() ?
Pour te mettre en garde.
Par la meme occasion, que signifie typename, car j'ai pas bien compris la doc :(
Deux utilisitations : dans une liste d'arguments templates où il peut être remplacé par class (la réciproque est fausse) ; dans le code template pour affirmer que tu as un type.
Le conteneur map est il bien adapté à ce genre de conception ?
J'ignore tout du domaine (le solfège ?). Est-ce qu'une trame ne pourrait pas être un tableau de paires (date, tempo) ?
La classe template mapPos est vide, et ca me choque un peu, mais rassurez moi, ca ne pose aucun problème ?
Qu'une classe soit vide ne pose pas de problèmes. L'héritage d'une classe template par une autre classe template est plus problèmatique :
template< typename _X > struct Bar: Foo< _X > { int youpla() { return boom(); } };
int main() { return Bar< void >().youpla(); }
c++ test.cc; ./a.out && echo OK OK
~/bin/c++ test.cc; ./a.out && echo OK
Le bon résultat est le second.
Les méthodes template CTrame::GetChange() et CTrame::SetChange() ne doivent elle pas etre plutot des fonctions externes à la classe CTrame ?
Certainement puisqu'elles n'accèdent à aucun membre de CTrame. Et comme elles travaillent sur une maPos, elles pourraient devenir membre de maPos.
template <class T> class mapPos {
map<unsigned int,T> theMap_;
public: T GetChange(unsigned int pos) const; void SetChange(unsigned int pos, const T& t);
};
Pourquoi le compilateur n'accepte pas que je supprime le commentaire dans la méthode CTrame::Out().
Lis le message d'erreur.
Si je me suis competement planté, y a t il un moyen d'utiliser directement la fonction copy(begin, end, ostream_iterator) dans la méthode template CTrame::Out(mapPos), ou bien faut il que je créé une fonction template operator<<(ostream os, pair<int,T>) (non testé), ou bien encore que je dérive un classe de ostream_iterator<pair<int,T>> et une fonction operator<<(ostream, pair<int,T>) (nom testé nom plus), ou bien je divague dans les spheres éthérés ?
Au choix. Que reproches-tu à ta fonction ? Note que, comme précédemment, CTrame::Out(mapPos const &) const pourrait devenir mapPos::Out() const.
Bon, je crois que ca suffit pour le moment. Merci pour ceux qui prendront le soin de me repondre...
Si tu posais une question par post, ce serait plus facile. -- Franck Branjonneau
But du code (le code est a la fin du post) :
Ranger des tempos dans une trame musicale, et donner le tempo à n'importe
quelle position dans la trame.
J'ignore ce que sont des tempos et des trames musicales.
La map contient les changements de tempo. Le code n'est pas complet,
notement en ce qui concerne CTrame::SetTempo, mais le propos n'est pas là.
Dans un avenir <tres> proche, je souhaite aussi rajouter des changements
de signature, de partie,... C'est le but de la classe template mapPos.
Signature ? Partie ?
Le code fonctionne, et le résulat correspond à mes attente,
C'est déjà bien.
Questions :
Pourquoi les warnings dus à un typename implicite lors de la création de
l'iterateur dans la fonction template CTrame::GetChange() ?
Pour te mettre en garde.
Par la meme occasion, que signifie typename, car j'ai pas bien compris la
doc :(
Deux utilisitations : dans une liste d'arguments templates où il peut
être remplacé par class (la réciproque est fausse) ; dans le code
template pour affirmer que tu as un type.
Le conteneur map est il bien adapté à ce genre de conception ?
J'ignore tout du domaine (le solfège ?). Est-ce qu'une trame ne
pourrait pas être un tableau de paires (date, tempo) ?
La classe template mapPos est vide, et ca me choque un peu, mais rassurez
moi, ca ne pose aucun problème ?
Qu'une classe soit vide ne pose pas de problèmes. L'héritage d'une
classe template par une autre classe template est plus problèmatique :
template< typename _X >
struct Bar: Foo< _X > { int youpla() { return boom(); } };
int main() { return Bar< void >().youpla(); }
c++ test.cc; ./a.out && echo OK
OK
~/bin/c++ test.cc; ./a.out && echo OK
Le bon résultat est le second.
Les méthodes template CTrame::GetChange() et CTrame::SetChange() ne
doivent elle pas etre plutot des fonctions externes à la classe
CTrame ?
Certainement puisqu'elles n'accèdent à aucun membre de CTrame.
Et comme elles travaillent sur une maPos, elles pourraient devenir
membre de maPos.
template <class T>
class mapPos {
map<unsigned int,T> theMap_;
public:
T GetChange(unsigned int pos) const;
void SetChange(unsigned int pos, const T& t);
};
Pourquoi le compilateur n'accepte pas que je supprime le commentaire dans
la méthode CTrame::Out().
Lis le message d'erreur.
Si je me suis competement planté, y a t il un moyen d'utiliser
directement la fonction copy(begin, end, ostream_iterator) dans la
méthode template CTrame::Out(mapPos), ou bien faut il que je créé
une fonction template operator<<(ostream os, pair<int,T>) (non
testé), ou bien encore que je dérive un classe de
ostream_iterator<pair<int,T>> et une fonction operator<<(ostream,
pair<int,T>) (nom testé nom plus), ou bien je divague dans les
spheres éthérés ?
Au choix. Que reproches-tu à ta fonction ?
Note que, comme précédemment, CTrame::Out(mapPos const &) const
pourrait devenir mapPos::Out() const.
Bon, je crois que ca suffit pour le moment. Merci pour ceux qui
prendront le soin de me repondre...
Si tu posais une question par post, ce serait plus facile.
--
Franck Branjonneau <fasbjx@free.fr>
But du code (le code est a la fin du post) : Ranger des tempos dans une trame musicale, et donner le tempo à n'importe quelle position dans la trame.
J'ignore ce que sont des tempos et des trames musicales.
La map contient les changements de tempo. Le code n'est pas complet, notement en ce qui concerne CTrame::SetTempo, mais le propos n'est pas là. Dans un avenir <tres> proche, je souhaite aussi rajouter des changements de signature, de partie,... C'est le but de la classe template mapPos.
Signature ? Partie ?
Le code fonctionne, et le résulat correspond à mes attente,
C'est déjà bien.
Questions : Pourquoi les warnings dus à un typename implicite lors de la création de l'iterateur dans la fonction template CTrame::GetChange() ?
Pour te mettre en garde.
Par la meme occasion, que signifie typename, car j'ai pas bien compris la doc :(
Deux utilisitations : dans une liste d'arguments templates où il peut être remplacé par class (la réciproque est fausse) ; dans le code template pour affirmer que tu as un type.
Le conteneur map est il bien adapté à ce genre de conception ?
J'ignore tout du domaine (le solfège ?). Est-ce qu'une trame ne pourrait pas être un tableau de paires (date, tempo) ?
La classe template mapPos est vide, et ca me choque un peu, mais rassurez moi, ca ne pose aucun problème ?
Qu'une classe soit vide ne pose pas de problèmes. L'héritage d'une classe template par une autre classe template est plus problèmatique :
template< typename _X > struct Bar: Foo< _X > { int youpla() { return boom(); } };
int main() { return Bar< void >().youpla(); }
c++ test.cc; ./a.out && echo OK OK
~/bin/c++ test.cc; ./a.out && echo OK
Le bon résultat est le second.
Les méthodes template CTrame::GetChange() et CTrame::SetChange() ne doivent elle pas etre plutot des fonctions externes à la classe CTrame ?
Certainement puisqu'elles n'accèdent à aucun membre de CTrame. Et comme elles travaillent sur une maPos, elles pourraient devenir membre de maPos.
template <class T> class mapPos {
map<unsigned int,T> theMap_;
public: T GetChange(unsigned int pos) const; void SetChange(unsigned int pos, const T& t);
};
Pourquoi le compilateur n'accepte pas que je supprime le commentaire dans la méthode CTrame::Out().
Lis le message d'erreur.
Si je me suis competement planté, y a t il un moyen d'utiliser directement la fonction copy(begin, end, ostream_iterator) dans la méthode template CTrame::Out(mapPos), ou bien faut il que je créé une fonction template operator<<(ostream os, pair<int,T>) (non testé), ou bien encore que je dérive un classe de ostream_iterator<pair<int,T>> et une fonction operator<<(ostream, pair<int,T>) (nom testé nom plus), ou bien je divague dans les spheres éthérés ?
Au choix. Que reproches-tu à ta fonction ? Note que, comme précédemment, CTrame::Out(mapPos const &) const pourrait devenir mapPos::Out() const.
Bon, je crois que ca suffit pour le moment. Merci pour ceux qui prendront le soin de me repondre...
Si tu posais une question par post, ce serait plus facile. -- Franck Branjonneau