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);
/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
Mais dans ton cas, std::deque<> me paraît plus adapté.
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 :
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
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 :
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 :
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).
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
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é !
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
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
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
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
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 :
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
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 :
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
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