2009-10-19 12 views
1

J'essaie d'obtenir du code C++ écrit à l'origine dans Microsoft Visual Studio (VS) 2003 pour compiler sous VS 2008 et j'ai du mal à trouver une solution efficace pour assigner un vecteur :: itérateur au début d'un tableau char. Je sais que itérateurs allaient d'être un défini comme un type simple pointeur (T *) à un type de classe entre VS 2003 et VS 2005. Voici un exemple simple de ce que je parle:Affectation de vector :: iterator à un tableau de tableau de caractères VS 2003

typedef std::vector<char>  CharContainer; 
typedef CharContainer::iterator InputIt; 

int FindNumMsgs(InputIt _inputIter, int _len); 

int ProcessBufferForMsgs(char buf[], const size_t maxlen) 
{ 
    int numMsgs = FindNumMsgs(InputIt(buf), maxlen); 
    ... 
} 

Ainsi, dans VS 2003, cela compile et fonctionne sans problème (puisque les itérateurs sont définis comme T *). Dans VS 2008, cette erreur avec C2440 (fonction-style-cast) puisque je ne peux plus simplement assigner l'itérateur avec le pointeur buf. Que ferais-je pour que cela fonctionne dans VS 2008 maintenant que les itérateurs sont un type de classe? Je pourrais copier le tampon dans un vecteur, puis passer dans myVec.begin(), mais je dois penser que je peux éviter cette surcharge.

+1

Ceci est un exemple parfait de "dette technique". Quelqu'un a utilisé un hack rapide pour faire fonctionner les choses, maintenant il vous reste à rembourser l'hypothèque. Pardon. –

Répondre

1

La solution appropriée serait de modéliser FindNumMsgs de sorte qu'il puisse fonctionner avec des itérateurs ou des pointeurs (puisque les pointeurs peuvent être utilisés comme itérateurs). Quelque chose comme ceci:

template <class T> 
int FindNumMsgs(T it, int count) { 
    while(count--) { 
     // do whatever 
     it++; 
    } 
    return n; 
} 
+2

La bibliothèque standard préfère utiliser begin, end comme paramètres plutôt que begin, count. Je suivrais leur exemple. Vous pouvez toujours utiliser begin + count dans l'appel de fonction. –

+0

vrai, mais je voulais offrir une solution cohérente avec son code existant. –

+0

mais, n'oublions pas 'fill_n' et similaire ;-). –

0

Si FindNumMsgs accepte char* comme premier paramètre, peut-être vous pouvez simplement utiliser un simple pointeur char*:

int ProcessBufferForMsgs(char buf[], const size_t maxlen) 
{ 
    char* simpleIterator = buf; 
    int numMsgs = FindNumMsgs(simpleIterator, maxlen); 
    ... 
} 
+1

En fait, buf est déjà un pointeur dans ce contexte. – sellibitze

+0

Le premier argument dans FindNumMsgs est un vecteur :: iterator. –

0

Quelle est la signature de FindNumMsgs? Si cela prend un caractère *, vous pouvez simplement remplacer InputIt(buf) par buf. Si ce n'est pas le cas, il y a peu de choses que vous pouvez faire à ce sujet sans changer FindNumMsgs.

+0

Eh bien, FindNumMsgs prend un vecteur :: iterator comme premier argument. Le but de cette question est d'éviter de changer l'appel de la fonction, ce qui ne se limite pas à mon exemple simple. –

+0

Je ne vois que deux options: (1) Tournez FindNumMsgs dans un template (en acceptant les itérateurs d'arbitratie) ou surchargez-le avec un paramètre char * ou const char *. (2) Copiez votre tampon dans un vecteur et utilisez l'itérateur du vecteur. – sellibitze

0

Temps pour refactoriser. Vous devez changer FindNumMsgs pour prendre un (const?) Char * comme entrée, ou peut-être fournir une deuxième version surchargée. Mieux encore en faire une fonction templative qui prend une paire début/fin de n'importe quoi avec la sémantique de l'itérateur ou du pointeur.

+0

Eh bien, il y a un tas de fonctions qui devraient être refactorisées et, franchement, la superposition serait trop lourde ici. Encore une fois, je pourrais juste copier le tampon dans un vecteur, passer dans son opérateur .begin() et être sur ma voie joyeuse, mais je pense qu'il doit y avoir un moyen de le faire sans avoir à faire une copie. –

+0

Parfois, je me sens comme la publicité où le gars est sur sa tondeuse à gazon et dit: «Je suis endetté jusqu'à mes yeux!" :-) Je suis principalement en train d'essayer de comprendre si on peut toujours utiliser les itérateurs directement sur un tableau, sans pour autant le copier dans un conteneur. –

+0

Bien sûr, si vous * devriez * faire cela est une autre histoire tout à fait ... –

Questions connexes