OVH Cloud OVH Cloud

itération dans un objet templaté

2 réponses
Avatar
Bastien Durel
Bonjour,

Dans une classe templatée (générique ?), j'ai défini une structure basée
sur le type paramétré, et un vecteur de cette structure.
Le problème est que je n'arrive pas à définir un itérateur pour le
parcourir :

Code >>>>>
template <class T>
class Shell
{
typedef struct
{
std::string cmd;
char shortcut;
bool (T::*func_ptr)(void);
} cmd_t;

std::vector<cmd_t> mCmds;

bool handle(const std::string& cmd)
{
using namespace std;
for (vector<cmd_t>::iterator i = mCmds.begin(); i != mCmds.end(); ++i)
if (cmd == (i->cmd) || cmd == string(1, i->shortcut))
return (this->*(i->func_ptr))();
return false;
}
// D'autres choses, dont help() du même genre
};
<<<<<

À la compilation, celà donne ça :
g++ -O2 -g3 -Wall -I. -c -o shell.o shell.cpp
./shell.hh: In member function 'bool Shell<T>::handle(const std::string&)':
./shell.hh:30: error: expected `;' before 'i'
./shell.hh:30: error: 'i' was not declared in this scope
./shell.hh: In member function 'void Shell<T>::help()':
./shell.hh:39: error: expected `;' before 'i'
./shell.hh:39: error: 'i' was not declared in this scope
make: *** [shell.o] Erreur 1

De quelle manière m'y prends-je mal ?
(Notez que mon interface n'est pas stabilisée, alors si vous voyez une
manière plus "élégante" de faire que des pointeurs sur fonction, je suis
ouvert à toute proposition ;))

Merci,

--
Bastien Durel.

2 réponses

Avatar
Gabriel Dos Reis
Bastien Durel writes:

| Bonjour,
|
| Dans une classe templatée (générique ?), j'ai défini une structure basée
| sur le type paramétré, et un vecteur de cette structure.
| Le problème est que je n'arrive pas à définir un itérateur pour le
| parcourir :
|
| Code >>>>>
| template <class T>
| class Shell
| {
| typedef struct
| {
| std::string cmd;
| char shortcut;
| bool (T::*func_ptr)(void);
| } cmd_t;
|
| std::vector<cmd_t> mCmds;
|
| bool handle(const std::string& cmd)
| {
| using namespace std;
| for (vector<cmd_t>::iterator i = mCmds.begin(); i != mCmds.end(); ++i)
^^^^^^^^^^^^^^^^^^^^^^^^^^

typename vector<cmd_t>::iterator i = mCmds.begin();

Normalement, tu devrais introduire des typedef pour abbrévier tout ça.

-- Gaby
Avatar
Bastien Durel
Bastien Durel writes:
| for (vector<cmd_t>::iterator i = mCmds.begin(); i != mCmds.end(); ++i)
^^^^^^^^^^^^^^^^^^^^^^^^^^

typename vector<cmd_t>::iterator i = mCmds.begin();

Merci :)


Normalement, tu devrais introduire des typedef pour abbrévier tout ça.

Oui, ça devient urgent.


--
Bastien Durel.