Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2920 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1273937
Lereveur
Profitons de la vie.
Posté le 28-12-2005 à 02:03:01  profilanswer
 

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. :)

mood
Publicité
Posté le 28-12-2005 à 02:03:01  profilanswer
 

n°1273954
Taz
bisounours-codeur
Posté le 28-12-2005 à 09:38:34  profilanswer
 

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]

n°1273979
Lereveur
Profitons de la vie.
Posté le 28-12-2005 à 10:20:04  profilanswer
 

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.

n°1273987
Taz
bisounours-codeur
Posté le 28-12-2005 à 10:46:06  profilanswer
 

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

n°1273990
Taz
bisounours-codeur
Posté le 28-12-2005 à 10:47:00  profilanswer
 

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

n°1274019
Lereveur
Profitons de la vie.
Posté le 28-12-2005 à 12:03:36  profilanswer
 

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.

n°1274026
Joel F
Real men use unique_ptr
Posté le 28-12-2005 à 12:16:23  profilanswer
 

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
n°1274037
Lereveur
Profitons de la vie.
Posté le 28-12-2005 à 13:10:14  profilanswer
 

(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.

n°1274041
Taz
bisounours-codeur
Posté le 28-12-2005 à 13:32:51  profilanswer
 

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

n°1274048
Lereveur
Profitons de la vie.
Posté le 28-12-2005 à 13:47:42  profilanswer
 

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.
 

mood
Publicité
Posté le 28-12-2005 à 13:47:42  profilanswer
 

n°1274164
Lereveur
Profitons de la vie.
Posté le 28-12-2005 à 18:24:25  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[applet] probleme de mise à jour, modification non prise en compteprobleme flash mx video
probleme video flash mxProbleme avec un "imagecreatefromjpeg"
probleme site perso avec firefoxProblème de structures
Problème d'affichage entre IE et FirefoxProblème avec un script météo.
problème macro dans Word[C] problème de réallocation de la taille d'une chaine [résolu]
Plus de sujets relatifs à : Problème avec les <Vector> entre Visual Studio 6 et 8.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR