Problème avec les <Vector> entre Visual Studio 6 et 8.

Problème avec les <Vector> entre Visual Studio 6 et 8. - C++ - Programmation

Marsh Posté le 28-12-2005 à 02:03:01    

Bonjour.
Voila mon problème :  
J’utilise un code suivant depuis très longtemps sur Visual studio 6 :
 

Code :
  1. Cinematic.CinematicEvent.insert(&Cinematic.CinematicEvent[Selected],Tmp);


 
Et il ne ma jamais posé de problème.
Mais voilà. Aujourd’hui je suis passé à Visual Studio 8 (2005) et il me donne sur cette ligne une erreur avec pour commentaire :
 
mapeditor\main.cpp(510) : error C2664: 'std::_Vector_iterator<_Ty,_Alloc> std::vector<_Ty>::insert(std::_Vector_iterator<_Ty,_Alloc>,const _Ty & )' : cannot convert parameter 1 from '_CinematicEvent *' to 'std::_Vector_iterator<_Ty,_Alloc>'
        with
        [
            _Ty=_CinematicEvent,
            _Alloc=std::allocator<_CinematicEvent>
        ]
        No constructor could take the source type, or constructor overload resolution was ambiguous

 
Je ne vois vraiment pas ou est le problème ni comment le résoudre donc si quelqu’un ici à la solution …… ce serai cool qu’il (qu’elle) m’aide.
 
J’ai la même erreur sous une autre forme ici :
 

Code :
  1. _Character* _Characters::SeekCharacter(int ID)
  2. {
  3. vector <_Character>::iterator it;
  4. for (it=this->Character.begin();it!=this->Character.end();it++)
  5.  if(it->ID==ID) return it; //error
  6. return NULL;
  7. }


 
(pour la ligne avec error)
error C2440: 'return' : cannot convert from 'std::_Vector_iterator<_Ty,_Alloc>' to '_Character *'
        with
        [
            _Ty=_Character,
            _Alloc=std::allocator<_Character>
        ]
        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

Voila.
Merci d’avance. :)

Reply

Marsh Posté le 28-12-2005 à 02:03:01   

Reply

Marsh Posté le 28-12-2005 à 09:38:34    

T* et std::vector<T>::iterator peuvent/sont des types distincts. Certaines implémentations utilise T* comme type iterator mais il ne faut absolument pas en présumer. Pour ton problème, utilise v.begin() + i au lieu de &v[i]

Reply

Marsh Posté le 28-12-2005 à 10:20:04    

Taz a écrit :

T* et std::vector<T>::iterator peuvent/sont des types distincts. Certaines implémentations utilise T* comme type iterator mais il ne faut absolument pas en présumer. Pour ton problème, utilise v.begin() + i au lieu de &v[i]


 
Merci beaucoup.
 
Mais comment puis-je peu faire pour récupérer l’adresse d’un objet ?
Par exemple (marche sous VS6) :
 

Code :
  1. vector<_CinematicEvent>::iterator it;
  2. for(it=this->CinematicEvent.begin();it!=this->CinematicEvent.end();it++)
  3.  {
  4.  fputbuffer(fichier,(unsigned char*)it,sizeof(_CinematicEvent));
  5.  }


 
Ou la fonction fputbuffer prend un unsigned char* en param 2.
 
cinematic.cpp(240) : error C2440: 'type cast' : cannot convert from 'std::_Vector_iterator<_Ty,_Alloc>' to 'unsigned char *'
        with
        [
            _Ty=_CinematicEvent,
            _Alloc=std::allocator<_CinematicEvent>
        ]
        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

 
Merci d’avance.

Reply

Marsh Posté le 28-12-2005 à 10:46:06    

je t'ai dit quoi bordel ! un iterator c'est pas un T*. Si tu veux récupérer l'adresse d'un truc sur lequel t'as un iterator, ben tu fais un &*it

Reply

Marsh Posté le 28-12-2005 à 10:47:00    

fputbuffer(fichier, &*it, sizeof *it);
 
 
et si tu le peux, préfères ++it à it++. Pourquoi ? Cherche sur le forum, y a un topic la dessus

Reply

Marsh Posté le 28-12-2005 à 12:03:36    

Merci beaucoup de me reponde mais t'énerve pas pour ça :
Perso je trouve con de mètre &*it à  la place de it ... mais si c'est la mode...
(note :  pour moi un irerator à toujours été un T* :) )
Merci quand même.

Reply

Marsh Posté le 28-12-2005 à 12:16:23    

Lereveur a écrit :

Merci beaucoup de me reponde mais t'énerve pas pour ça :
Perso je trouve con de mètre &*it à  la place de it ... mais si c'est la mode...
(note :  pour moi un irerator à toujours été un T* :) )


 
C'est pas la mode c'est le standard :o
et si pour toi iterator = T*, ebn tu te fourvoie severement [:ootransparent]


Message édité par Joel F le 28-12-2005 à 12:16:54
Reply

Marsh Posté le 28-12-2005 à 13:10:14    

(Perso j'ai appris les it tous seul sur le tas donc ...)
Mais si tu connais de bons documents qui pourraient m’éclairer c’est avec plaisir que je les lirais.

Reply

Marsh Posté le 28-12-2005 à 13:32:51    

y a rien à dire, ton it c'est std::vector<T>::iterator et pas un T*. Après c'est RTFM pour savoir ce que fait *it

Reply

Marsh Posté le 28-12-2005 à 13:47:42    

Taz a écrit :

y a rien à dire, ton it c'est std::vector<T>::iterator et pas un T*. Après c'est RTFM pour savoir ce que fait *it


 
T'es bizarre comme mec quand même ... ya quelque chose à dire ... puis plus rien.
Bon ce n’est pas grave :)
Comme tu as l’aire de t'y connaître « un peu », j’ai une autre question :  
 
Maintenant il ne me reste plus qu’une erreur pour passer au VS8 (bientôt le paradis).
 
Lors du Linkage (je sais pas si ce mot existe) j’ai cette erreur :  
LINK : fatal error LNK1104: cannot open file 'libc.lib'
 
Le fichier n’existe pas dans le repertoire Lib de VS8.
Es-normale ? ou bien y’a-t-il eu un bug à l’installation.
 
J’ai essayer de copier le fichier 'libc.lib' du VS6 mais la sa devient la foire aux erreur de redefinition avec LIBCMTD.lib.
 
J’ai lue :  
Note: Any executable which accesses a DLL linked with MSVCRT.LIB must
       also link with MSVCRT.LIB instead of LIBC.LIB or LIBCMT.LIB.
       When using DLLs, it is recommended that all of the modules be
       linked with MSVCRT.LIB.

 
Comment on fait pour qu’il ne lie pas avec le fichier LIBC.LIB ? (si c’est bien la la solution).
 
Merci d’avance.
 

Reply

Marsh Posté le 28-12-2005 à 13:47:42   

Reply

Marsh Posté le 28-12-2005 à 18:24:25    

Bon voila merci quand même j'ai trouvé.
 
Pour ce qui aurai le même problème il siffit de rajouter la ligne
/nod:libc.lib
 
dans

Properties/Linker/Input/Additional Dependancies

 
Voila :)
Vive la vie.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed