Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme stl list

6 réponses
Avatar
Blue_Bear
j'essaie de compiler un petit bout de code avec
g++ test.cpp
voici le code

// Standard Template Library example

#include <iostream>
#include <list>
using namespace std;

// Simple example uses type int

int main(void)
{
   list<int> L;
   L.push_back(0);              // Insert a new element at the end
   L.push_front(0);             // Insert a new element at the beginning
   L.insert(++L.begin(),2);     // Insert "2" before position of first
argument
                                // (Place before second argument)
   L.push_back(5);
   L.push_back(6);

   list<int>::iterator i;

   for(i=L.begin(); i != L.end(); ++i) cout << *i << " ";
   cout << endl;
   return 0;
}

mais j'ai l'erreur suivante

quel est le probleme?


/home/blue/tmp/cc1SvRXs.o(.gnu.linkonce.t._ZNSt14__simple_allocISt10_List_nodeIiESt24__default_alloc_templateILb1ELi0EEE8allocateEj+0x28):
In function `std::__simple_alloc<std::_List_node<int>,
std::__default_alloc_template<(bool)1, (int)0> >::allocate(unsigned)':
: undefined reference to `std::__default_alloc_template<(bool)1, (int
0>::allocate(unsigned)'
/home/blue/tmp/cc1SvRXs.o(.gnu.linkonce.t._ZNSt14__simple_allocISt10_List_nodeIiESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS1_j+0x24):
In function `std::__simple_alloc<std::_List_node<int>,
std::__default_alloc_template<(bool)1, (int)0>
>::deallocate(std::_List_node<int>*, unsigned)':
: undefined reference to `std::__default_alloc_template<(bool)1, (int
0>::deallocate(void*, unsigned)'
collect2: ld returned 1 exit status

6 réponses

Avatar
Fabien LE LEZ
On Tue, 29 Nov 2005 23:16:38 +0100, Blue_Bear
<cerbere@[NOSPAM]rhapsodyk.net >:

   L.insert(++L.begin(),2);


Tu essaies de modifier L.begin(), qui est une rvalue (i.e. non
modifiable).

Si tu veux vraiment faire ça, il faudrait passer par une variable
intermédiaire :

std::list<int>::iterator it= L.begin();
++it;
assert (it != L.end());
L.insert (it, 2);

Mais dans ton cas, std::deque<> me paraît plus adapté.

Avatar
kanze
Fabien LE LEZ wrote:
On Tue, 29 Nov 2005 23:16:38 +0100, Blue_Bear
<cerbere@[NOSPAM]rhapsodyk.net >:

L.insert(++L.begin(),2);


Tu essaies de modifier L.begin(), qui est une rvalue (i.e. non
modifiable).


Je ne crois pas.

Formellement, on ne sait rien de concret du type
list<>::iterator, ni de comment est implémenté ++ sur lui. Mais
dans la pratique, c'est une classe, et donc même un rvalue est
un objet, et modifiable. (Au moins que begin() renvoie en fait
iterator const. Mais je ne suis même pas sûr que c'est permis.)

Selon le cas, operator++() est une fonction membre, et
l'expression est légale, ou c'est une fonction libre qui prend
une référence non-const, et l'expression est illégale (mais
permise par beaucoup de compilateurs).

Si tu veux vraiment faire ça, il faudrait passer par une
variable intermédiaire :

std::list<int>::iterator it= L.begin();
++it;
assert (it != L.end());
L.insert (it, 2);


Pourquoi l'assert. L'itérateur final est bien légal ici.
L'insertion se fait *avant* l'itérateur.

Mais dans ton cas, std::deque<> me paraît plus adapté.


S'il insère autre part qu'en tête ou en queue, comme ici, ce
n'est pas évident.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Fabien LE LEZ
On 30 Nov 2005 00:46:44 -0800, "kanze" :

S'il insère autre part qu'en tête ou en queue, comme ici, ce
n'est pas évident.


Il a l'air de vouloir travailler avec la notion d'indice (mettre un
élément en 2è place par exemple).

Avatar
Falk Tannhäuser
Blue_Bear wrote:

j'essaie de compiler un petit bout de code avec
g++ test.cpp


Est-ce bien la la ligne de commande que tu utilises
pour compiler ? Ça devrait passer, mais tu as
manifestement un problème à l'édition des liens.
Ton GCC est peut-être mal installé !

Falk

Avatar
Blue_Bear
Falk Tannhäuser wrote:

Blue_Bear wrote:

j'essaie de compiler un petit bout de code avec
g++ test.cpp


Est-ce bien la la ligne de commande que tu utilises
pour compiler ? Ça devrait passer, mais tu as
manifestement un problème à l'édition des liens.
Ton GCC est peut-être mal installé !

Falk


effectivement j'ai mis a jour gcc et ca marche
c'est étrange que l install précédente ne m ai pas fait ca proprement


Avatar
Blue_Bear
Fabien LE LEZ wrote:

On Tue, 29 Nov 2005 23:16:38 +0100, Blue_Bear
<cerbere@[NOSPAM]rhapsodyk.net >:

L.insert(++L.begin(),2);


Tu essaies de modifier L.begin(), qui est une rvalue (i.e. non
modifiable).

Si tu veux vraiment faire ça, il faudrait passer par une variable
intermédiaire :

std::list<int>::iterator it= L.begin();
++it;
assert (it != L.end());
L.insert (it, 2);

Mais dans ton cas, std::deque<> me paraît plus adapté.


il n y a pas vraiment de cas, c'est juste un prog de test, car les erreurs
de link arrivent dans un autre programme, j ai repris ce bout d'exemple
(qui compile ss pb normalement) pour voir si c t un pb de link venat de mes
obj ou si c t la lib qui deconnait. a

apparemnt, c la lib qui était mal installée