IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Visual Studio problème avec le fichier utility


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut Visual Studio problème avec le fichier utility
    Bonjour,

    Il existe un fichier nommé utility dans un sous-dossier de VS.
    Je ne l'ai pas appellé, il est donc appellé par d'autres fichiers.
    Et malheureusement, à la compilation, ce fichier contient des erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    pair& operator=(pair<_Ty1, _Ty2>&& _Right)
    { // assign from moved pair
    this->first = _STD move(_Right.first);
    this->second = _STD move(_Right.second);
    return (*this);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     error C2106: '=' : left operand must be l-value
    Alors je me suis dit, j'ai du mal configurer quelque chose.
    Est-ce que quelqu'un saurait comment résoudre ce problème?
    merci
    raphchar

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Bonjour.

    <utility> est un fichier de la std. je t'assure qu'il n'est pas bugué.

    dans ton cas, le problème vient du fait que std::pair est un template et donc que les types utilisés peuvent êtres invalides avec les opérateur censés être fournis par les classes passées en paramètres templates.

    En l'occurence il semble que tu utilise visual 2010 et une implémentation C++0x. il semble qu'il y ait confusion entre rvalue et lvalue.

    Pourrais-tu nous donner la pile complète des appels histoire que l'on voie d'où cela vient ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Je me doute bien que utility n'est pas buggé

    Citation Envoyé par méphistopheles Voir le message
    En l'occurence il semble que tu utilise visual 2010 et une implémentation C++0x. ?
    Non je n'utilise pas c++0x

    Citation Envoyé par méphistopheles Voir le message
    Pourrais-tu nous donner la pile complète des appels histoire que l'on voie d'où cela vient ?
    Ce n'est pas du débuggage donc, pas de pile d'appel.

    Peut-être le problème vient-il de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vec2f & operator=(const vec2f & src) { x=src.x; y=src.y; return *this; } 
    vec3f & operator= ( const vec3f & src ) { x=src.x; y=src.y; z=src.z; return *this; }

  4. #4
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par raphchar Voir le message
    Ce n'est pas du débuggage donc, pas de pile d'appel.
    Lorsque le compilateur cherche à compiler, il regarde d'abord les sources, essaye de les compiler, et si un template est par exemple instancié dedans, il va lire la déclaration du template, essayer de la compiler, etc... jusqu'à ce que tous les types soits résolu ou qu'il y ait un erreur. S'il n'y a pas d'appel eu sens runtime du terme, j'entend par la, la trace de ton compilo jusqu'au fichier incluant le header et instanciant ton pair.

    Citation Envoyé par raphchar Voir le message
    Peut-être le problème vient-il de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vec2f & operator=(const vec2f & src) { x=src.x; y=src.y; return *this; } 
    vec3f & operator= ( const vec3f & src ) { x=src.x; y=src.y; z=src.z; return *this; }
    je ne vois pas pourquoi, ce genre de code n'a pas de raison de ne pas marcher.

    Par contre,
    Citation Envoyé par raphchar Voir le message
    Non je n'utilise pas c++0x
    peut être mais le code que tu montre en exemple utilise du c++0x (ou alors y'a encore un truc que j'ai loupé dans la norme précédente ) : dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pair& operator=(pair<_Ty1, _Ty2>&& _Right)
    "&&" désigne un objet passé par rvalue... et à ma conaissance, seul le c++0x (TR1 c++11 et compagnie) définissent la rvalue.
    Ensuite, je sais qu'il y a des histoires un peu compliquées sur la transformation de lvalue en rvalue et c'est probablement de là que vient ton erreur.

    Je vais voir si je peux trouver plus d'information à ce sujet.

    bonne chance

  5. #5
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Donc il faut que je mette:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vec2f  operator=(const vec2f  src) {vec2f res; res.x=src.x; res.y=src.y; return res; }
    Et ca devrait marcher?
    J'essaie

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    T'as un switch 0x activé c'est obligé. Car les parties du codes avec des rvalue ref sont entouré par des #define. Quel visual studio?

  7. #7
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par Goten Voir le message
    T'as un switch 0x activé c'est obligé. Car les parties du codes avec des rvalue ref sont entouré par des #define. Quel visual studio?
    Il utilise 2010 (il l'a dit dans une autre discussion).

    Par contre, on aimerait bien voir comment est appelé/construit std::pair rapchar, ça accélérerait beaucoup les choses.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Peut être il y a un mix dans les options de compil qui font que certaines parties sont compilées en C++03 et d'autres en C++0X (cela implique la présence de 2 versions de visual, la 2010 et une 2008).

    Citation Envoyé par raphchar Voir le message
    Peut-être le problème vient-il de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vec2f & operator=(const vec2f & src) { x=src.x; y=src.y; return *this; } 
    vec3f & operator= ( const vec3f & src ) { x=src.x; y=src.y; z=src.z; return *this; }
    Si ton opérateur= est aussi trivial, alors pourquoi le redéfinir ? Le compilateur génère exactement le même.

  9. #9
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Peut être il y a un mix dans les options de compil qui font que certaines parties sont compilées en C++03 et d'autres en C++0X (cela implique la présence de 2 versions de visual, la 2010 et une 2008).

    Si ton opérateur= est aussi trivial, alors pourquoi le redéfinir ? Le compilateur génère exactement le même.
    Il y a effectivement des "restes" de vs2008.
    Oui effectivement l'opérateur= est redéfini (sans doute n'est-il pas utile) (Mais à l'origine, ce n'est pas mon code, mais un code que j'adapte pour windows, d'où tout mes soucis)

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par raphchar Voir le message
    Mais à l'origine, ce n'est pas mon code, mais un code que j'adapte pour windows, d'où tout mes soucis
    Simplifier le code en enlevant les parties 'inutiles' ne pourra que faciliter ton portage.

  11. #11
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Le problème ne vient pas de cet opératateur, l'ayant supprimé partout, ce n'est pas seulement lui qui pose problème.

  12. #12
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par raphchar Voir le message
    Le problème ne vient pas de cet opératateur, l'ayant supprimé partout, ce n'est pas seulement lui qui pose problème.
    Pourrait-on avoir le message d'erreur complet ? surtout la partie avec les "intancied here" qui nous permettrais de savoir d'où vient l'erreur.

  13. #13
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Voila le log, à l'endroit de l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(260): error C2106: '=' : l'opérande gauche doit être une l-value
                     C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(259) : lors de la compilation de la fonction membre 'std::pair<_Ty1,_Ty2> &std::pair<_Ty1,_Ty2>::operator =(std::pair<_Ty1,_Ty2> &&)' de la classe modèle
                     with
                     [
                         _Ty1=float [4],
                         _Ty2=const ikbone *[4]
                     ]
                     cluster.cpp(17) : voir la référence à l'instanciation de la classe modèle 'std::pair<_Ty1,_Ty2>' en cours de compilation
                     with
                     [
                         _Ty1=float [4],
                         _Ty2=const ikbone *[4]
                     ]
         1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(261): error C2106: '=' : l'opérande gauche doit être une l-value
             dxt.cpp
    avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ClCompile:
             C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\CL.exe /c /Zi /nologo /W3 /WX- /Od /Oy- /D "WIN32,_DEBUG,_WINDOWS,_AFXDLL,_MBCS,NT_PLUGIN,REQUIRE_IOSTREAM" /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Release\\" /Fd"Release\vc100.pdb" /Gd /TP /analyze- /errorReport:prompt cluster.cpp dxt.cpp gprim.cpp ikbone.cpp m2.cpp maya.cpp mayaCmd.cpp mdl.cpp skin.cpp vec.cpp wmo.cpp
             cluster.cpp

  14. #14
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Pffiu, faut te tirer les vers du nez
    Donc maintenant, comme demandé plusieurs fois par méphistopheles, pourrais tu double-cliquer sur la ligne "cluster.cpp(17) : voir la référence à l'instanciation de la classe modèle 'std::pair<_Ty1,_Ty2>' en cours de compilation" ? Cela devrait t'amener à la ligne 17 de cluster.cpp et tu pourras enfin nous montrer d'où vient l'erreur.

  15. #15
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Pffiu, faut te tirer les vers du nez
    Donc maintenant, comme demandé plusieurs fois par méphistopheles, double cliques sur la ligne "cluster.cpp(17) : voir la référence à l'instanciation de la classe modèle 'std::pair<_Ty1,_Ty2>' en cours de compilation" ce qui va t'ammener à la ligne 17 de cluster.cpp et tu pourras enfin nous montrer d'où vient l'erreur.
    En effet -_-' Par contre, il me semble que l'erreur vienne du fait qu'il y a un const * ... je vois pas comment un pair pourait garantir qu'un pointeur reste const donc...

    A confirmer cependant :s

  16. #16
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Pffiu, faut te tirer les vers du nez
    Donc maintenant, comme demandé plusieurs fois par méphistopheles, pourrais tu double-cliquer sur la ligne "cluster.cpp(17) : voir la référence à l'instanciation de la classe modèle 'std::pair<_Ty1,_Ty2>' en cours de compilation" ? Cela devrait t'amener à la ligne 17 de cluster.cpp et tu pourras enfin nous montrer d'où vient l'erreur.
    Oui effectivement, vu que cette information ne s'affichait pas dans la liste d'erreur, de plus le double clique nez fonctionne pas.

    Dans le code, j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _weights[i].first[j]=0.0f;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector< slots > _weights;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef std::pair<float[4], const ikbone *[4]> slots;
    Bon c'est pas gagné, dans mon apprentissage, je n'ai jamais eu deux types entre les <>

  17. #17
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Coupable trouvé !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::pair<float[4], const ikbone *[4]> slots;
    Malheureusement, il n'est pas possible d'utiliser des tableaux en [] dans les conteneurs standards comme std::pair ou std::vector, du à une horreur hérité du C : les tableaux en [] n'ont pas de sémantique de valeur, comparé à tout le reste du langage, par exemple :
    1) Ils se convertissent implicitement en pointeur pour un oui et pour un non.
    2) Les tableaux sont automatiquement passés par référence en paramètre de fonction contrairement à tout le reste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    foo(int[] t)
    {
    // fourberie ! t n'est pas une copie de a, t est une référence sur a !
    }
     
    int main()
    {
      int a[5];
      foo(a);
    }
    3) Et surtout, ils ne sont pas Assignable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int a[5];
    int b[5];
    a = b; //error C2106: '=' : l'opérande gauche doit être une l-value
    Or les conteneurs standards comme std::pair ou std::vector ne peuvent contenir que des objets assignables. (c.a.d ayant un opérateur= définit).

    Si tu as un compilateur récent (au moins gcc 4.4 ou vs2008) alors tu peux remplacer les tableaux en [] par des std::array :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef std::pair<std::array<float, 4>, std::array<ikbone*, 4>> slots; // OK

  18. #18
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    D'accord, merci pour les infos. Les problèmes semblent résolus.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/06/2016, 14h26
  2. [pthreads w32][visual studio] problème d'édition de lien avec la librairie static
    Par Yruama_Lairba dans le forum Bibliothèques, systèmes et outils
    Réponses: 2
    Dernier message: 13/08/2014, 21h03
  3. Problème MS Visual Studio 2010 avec MS SQL Server
    Par nadjibnet dans le forum ADO.NET
    Réponses: 0
    Dernier message: 18/12/2010, 15h30
  4. Réponses: 0
    Dernier message: 01/03/2009, 14h44
  5. Publier dans visual studio(problème avec powerpack)
    Par sasuke_ochiwa dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/09/2007, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo