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

probleme de parser sur les template avec gcc

4 réponses
Avatar
Yannick Le goc
Bonjour,


Voici un exemple de code ne passant pas la phase de "parsing" sous gcc
3.2.2 mais compilant sous .NET 2003.

Dois-je attendre une nouvelle version du compilateur pour compiler ce
code ou est-ce sans espoir?


Yannick

code:

template<class T>
class A
{
public:
template<class F>
void foo() {};
};

template<class T>
class B
{
public:
void error()
{
A<int> a;
a.A<int>::foo<float>();// ok
a.foo<float>();// parse error!

A<T> b;
b.A<T>::foo<float>();// parse error!
b.foo<float>();// parse error!
};
};

int main()
{
return 1;
}

g++ -c -pipe -Wall -W -O2 -fomit-frame-pointer -pipe -march=i586
-mcpu=pentiumpro -D_REENTRANT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT
-I/usr/lib/qt3/mkspecs/default -I. -I/usr/lib/qt3/include -o main.o main.cpp
main.cpp: In member function `void B<T>::error()':
main.cpp:17: parse error before `;' token
main.cpp:21: parse error before `;' token

4 réponses

Avatar
Vincent Richard

Voici un exemple de code ne passant pas la phase de "parsing" sous gcc
3.2.2 mais compilant sous .NET 2003.

[...]
A<int> a;
a.A<int>::foo<float>();// ok
a.foo<float>();// parse error!


a.template foo<float>();

A<T> b;
b.A<T>::foo<float>();// parse error!


b.A<T>::template foo<float>(); // pas sûr de celui-ci

b.foo<float>();// parse error!


b.template foo<float>();

Ca fonctionnera avec tous les compilateurs.

Merci à Gabriel Dos Reis qui m'a donné cette solution quand j'avais
eu le même problème.

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/

Avatar
Marc Boyer
Vincent Richard wrote:

A<int> a;
a.A<int>::foo<float>();// ok
a.foo<float>();// parse error!


a.template foo<float>();


Mon Dieu...
J'ai lu quelques bouquins C++, et je ne me souviens
pas avoir jamais vu ça. C'est un bug g++ ou un aspect
de C++ qui m'a complètement échappé.

En plus, je dois avoir un problème similaire dans
un de me projet en cours (que j'avais remis "à plus tard").

Ca fonctionnera avec tous les compilateurs.

Merci à Gabriel Dos Reis qui m'a donné cette solution quand j'avais
eu le même problème.


En relisant la bible, je suis tombé dessus: $C.13.6

Marc Boyer, qui devrait plus lire les annexes
--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
Jean-Marc Bourguet
Marc Boyer writes:

Vincent Richard wrote:

A<int> a;
a.A<int>::foo<float>();// ok
a.foo<float>();// parse error!


a.template foo<float>();


J'ai lu quelques bouquins C++, et je ne me souviens
pas avoir jamais vu ça.


De meme qu'il faut utiliser typename avec les noms de types
dependants, il faut utilser template avec les noms de template
dependant.

A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| Marc Boyer writes:
|
| > Vincent Richard wrote:
| > >
| > >> A<int> a;
| > >> a.A<int>::foo<float>();// ok
| > >> a.foo<float>();// parse error!
| > >
| > > a.template foo<float>();
| >
| > J'ai lu quelques bouquins C++, et je ne me souviens
| > pas avoir jamais vu ça.
|
| De meme qu'il faut utiliser typename avec les noms de types
| dependants, il faut utilser template avec les noms de template
| dependant.

Avec le bémol que dans le cas spécifique sous la main, c'est une
déficience du parseur de GCC-3.x, x < 4.

Mais globablement, tu as raison.

-- Gaby