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

[g++] Bug avec "double" template ?

2 réponses
Avatar
Vincent Richard
Bonjour,

J'ai un petit problème en essayant de compiler le code donné ci-après avec
g++ (version 3.2.2 sous GNU/Linux).

L'erreur donnée par g++ est :

essai.cpp: In constructor `A::initialiseur<T>::initialiseur(const
std::string&)':
essai.cpp:33: parse error before `;' token

Le code suivant est-il correct (et donc, est-ce un bug de g++), ou bien
ai-je oublié quelque chose (auquel cas le message d'erreur n'est pas du
tout explicite) ?

Voici le programme en cause :

#include <string>

class fabrique
{
public:

template <class T>
void enregistrer(const std::string& nom)
{
// ...
}

static fabrique& instance()
{
static fabrique f;
return f;
}
};

class A
{
public:

virtual ~A() { }

template <class T>
class initialiseur
{
public:

initialiseur(const std::string& nom)
{
fabrique::instance().enregistrer <T>(nom); // *** ERREUR ***
}
};
};

class B : public A { /* ... */ };

A::initialiseur <B> initB("b");

int main() { /* ... */ }

Merci d'avance pour vos réponses.

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

2 réponses

Avatar
Gabriel Dos Reis
Vincent Richard writes:

[...]

| template <class T>
| class initialiseur
| {
| public:
|
| initialiseur(const std::string& nom)
| {
| fabrique::instance().enregistrer <T>(nom); // *** ERREUR ***

Ceci est un bug dur à fixer dans le parseur de GCC 3.2.x ou 3.3.x
(c'est fixé dans la version 3.4.x). Tu peux contourner cette
déficience en ajoutant un ".template" (qui est autorisé ici, mais non
requis)

fabrique::instance().template enregistrer<T>(nom);

C'est documenté sur la page de GCC.

-- Gaby
Avatar
Vincent Richard

Vincent Richard writes:

[...]

| template <class T>
| class initialiseur
| {
| public:
|
| initialiseur(const std::string& nom)
| {
| fabrique::instance().enregistrer <T>(nom); // *** ERREUR

Ceci est un bug dur à fixer dans le parseur de GCC 3.2.x ou 3.3.x
(c'est fixé dans la version 3.4.x). Tu peux contourner cette déficience
en ajoutant un ".template" (qui est autorisé ici, mais non requis)

fabrique::instance().template enregistrer<T>(nom);


Merci pour ta réponse.
Vivement GCC 3.4... :-)

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/