OVH Cloud OVH Cloud

Problemes avec g++-3.0

3 réponses
Avatar
Luc Mazardo
--=-=-=

Bonjour,

Je rencontre quelques problemes avec l'utilisation
des STLs avec le compilateur g++ 3.0 (gcc version 3.0.4).
Avec la version 2.95 (gcc version 2.95.4 20011002 (Debian prerelease),
je n'ai aucun probleme.
Voici le code source:


--=-=-=
Content-Type: text/x-c++src
Content-Disposition: attachment; filename=main.cpp

#include <pair.h>
#include <string>
#include <map>


#ifdef __GNUC__
#if __GNUC__ < 3
#include <hash_map.h>
namespace Sgi { using ::hash_map; }; // inherit globals
#else
#include <ext/hash_map>
#if __GNUC_MINOR__ == 0
namespace Sgi = std; // GCC 3.0
#else
namespace Sgi = ::__gnu_cxx; // GCC 3.1 and later
#endif
#endif
#else // ... there are other compilers, right?
namespace Sgi = std;
#endif


using namespace std;


//TODO: include this definition in the Hashtable class
template<> struct hash<string>
{
size_t operator()(const string& s) const
{
return hash<char const*>()(s.c_str());
}
};


#ifdef NAMESPACES
namespace foobar {
#endif

class NoSuchElementException
{
public:
NoSuchElementException(string w) {_what = w;}
virtual ~NoSuchElementException() {}
virtual string what() { return _what; }
private:
string _what;
};
template <class T> class Hashtable //: public ost::Conditional
{
public:
Hashtable() {} //: Conditional() {}

virtual ~Hashtable() {clear(); }
virtual T put(const string& key, T value)
{
assert(key.c_str() != NULL); //TODO: must throw ?

// enterMutex();
T returnValue = mHashtable[key];
mHashtable[key] = value;
// leaveMutex();

return returnValue;
}

virtual T get(const string& key) throw (NoSuchElementException)
{
assert(key.c_str() != NULL); //TODO: must throw ?
// enterMutex();

if (mHashtable.empty())
{
// leaveMutex ();
throw NoSuchElementException (key);
}

if (mHashtable.find(key) == mHashtable.end())
{
// leaveMutex();
throw NoSuchElementException(key);
}

T returnValue = mHashtable[key];
//leaveMutex();

return returnValue;
}
virtual void del(const string& key) throw (NoSuchElementException)
{
assert(key.c_str() != NULL); //TODO: must throw ?
// enterMutex();

if (mHashtable.find(key) == mHashtable.end()) {
// leaveMutex();
throw NoSuchElementException(key);
}
mHashtable.erase (key);
// leaveMutex();

return;
}
virtual void clear() {
// enterMutex();
mHashtable.erase(mHashtable.begin(), mHashtable.end());
// leaveMutex();
}

virtual bool isEmpty () {
bool ret;
// enterMutex();
ret = mHashtable.empty ();
// leaveMutex();
return ret;
}

virtual vector<pair<string,T> > toVector()
throw (NoSuchElementException)
{
vector <pair<string, T> > v;
// enterMutex();

if (mHashtable.empty()) {
// leaveMutex();
throw NoSuchElementException(string("hashtable is empty"));
}



for(hash_map<string, T , hash<string> >::iterator iter
= mHashtable.begin(); iter != mHashtable.end(); ++iter)
{
pair <string, T> p(*iter);// (iter->first, iter->second);
v.insert(v.begin(), p);
}

//leaveMutex();
return v;
}

protected:
hash_map<string, T, hash<string> > mHashtable;
};

int
main(void)
{
Hashtable<int> h;

return 0;
}
#ifdef NAMESPACES
}; // foobar
#endif

/** EMACS **
* Local variables:
* mode: c++
* c-basic-offset: 4
* End:
*/

--=-=-=


Merci par avance.


--
Luc.Mazardo@NOSPANcvf.fr


--=-=-=--

3 réponses

Avatar
Alexandre
"Luc Mazardo" a écrit dans le message de
news:
Bonjour,

Je rencontre quelques problemes avec l'utilisation
des STLs avec le compilateur g++ 3.0 (gcc version 3.0.4).
Avec la version 2.95 (gcc version 2.95.4 20011002 (Debian prerelease),
je n'ai aucun probleme.
Voici le code source:


Et où qu'il est le problème ?
Essayé avec un autre compilo, bien sur ça compile pas :
impossible d'ouvrir "pair.h"
"virtual" ne peut être employé qu'avec des fonctions membres non modèles
nom de type attendu (sur une déclaration de vector, normal car vector n'est
pas inclus

je suppose que "pair.h" c'est la définition de la paire "classique". Inutile
car amenée par map. Donc je vire.
Je rajoute l'inclusion de vector.
Et là, ça compile toujours pas : nom de type attendu sur "hash_map"... qui
n'est effectivement pas standard AMA.
C'est donc surprenant que ça passe avec gcc, non ?

Avatar
Luc Mazardo
"Alexandre" a écrit le mardi 20 janvier 2004 :

"virtual" ne peut être employé qu'avec des fonctions membres non modèles
nom de type attendu (sur une déclaration de vector, normal car vector n'est
pas inclus
desole je n'avais donner le source entier.


Et là, ça compile toujours pas : nom de type attendu sur "hash_map"... qui
n'est effectivement pas standard AMA.
C'est donc surprenant que ça passe avec gcc, non ?
en fait ca passe avec g++ version 2.95 mais pas le 3.00.


Merci quand meme.

--


Avatar
syn-vador VS obilan clémobil (alias ben soussan)
Luc Mazardo wrote:

"Alexandre" a écrit le mardi 20 janvier 2004 :

"virtual" ne peut être employé qu'avec des fonctions membres non modèles
nom de type attendu (sur une déclaration de vector, normal car vector
n'est pas inclus
desole je n'avais donner le source entier.


Et là, ça compile toujours pas : nom de type attendu sur "hash_map"...
qui n'est effectivement pas standard AMA.
C'est donc surprenant que ça passe avec gcc, non ?
en fait ca passe avec g++ version 2.95 mais pas le 3.00.


Merci quand meme.

je repond peut etre a coté, car jai survolé ton post, mais essai de metre la

derniere version de g++ et apres tu mets glibc, moi ca ma corrigé mes
problemes.