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

type membre d'une classe template

18 réponses
Avatar
Thierry Noc
Bonjour, il y a quelque temps que j'ai pas fait de C++ et de plus j'ai
échangé gcc 2.95 contre 3.4.2, et je n'arrive pas a compiler le bout de
code suivant, je ne comprend pas pourquoi, j'ai du louper un chapitre:

#include <map>

template <typename Key>
inline void fn()
{
std::map<Key, int>::iterator iter;
}


$ g++ -Wall -c -o tst1.o tst1.cpp
tst1.cpp: In function `void fn()':
tst1.cpp:6: error: expected `;' before "iter"

10 réponses

1 2
Avatar
Matthieu Moy
Thierry Noc writes:

Bonjour, il y a quelque temps que j'ai pas fait de C++ et de plus j'ai
échangé gcc 2.95 contre 3.4.2, et je n'arrive pas a compiler le bout de
code suivant, je ne comprend pas pourquoi, j'ai du louper un chapitre:


gcc 3.4 est /beaucoup/ plus respectueux du standard que 2.95. La
migration est difficile mais ça vaut le coup !

#include <map>

template <typename Key>
inline void fn()
{
std::map<Key, int>::iterator iter;
typename std::map<Key, int>::iterator iter;


}


(je ne sais plus exactement avec quoi il y a ambiguité, mais il faut
preciser au compilo que std::map<Key, int>::iterator est un type)

--
Matthieu

Avatar
Stanislas RENAN
Bonjour,



Thierry Noc writes:

std::map<Key, int>::iterator iter;


typename std::map<Key, int>::iterator iter;


(je ne sais plus exactement avec quoi il y a ambiguité, mais il faut
preciser au compilo que std::map<Key, int>::iterator est un type)

il me semble que c'est quand tu déclares un pointeur :

std::map<Key, int>::iterator * iter;

sans "typename", le caractère "*" est interprété comme une
multiplication, et std::map<Key, int>::iterator comme un membre à
multiplier.
Pour que l'interprétation du source soit correcte, il faut préciser
typename.

--
Stanislas RENAN


Avatar
Gabriel Dos Reis
Stanislas RENAN writes:

| Bonjour,
|
|
|
| > Thierry Noc writes:
| >
| >> std::map<Key, int>::iterator iter;
| > typename std::map<Key, int>::iterator iter;
| >
|
| > (je ne sais plus exactement avec quoi il y a ambiguité, mais il faut
| > preciser au compilo que std::map<Key, int>::iterator est un type)
| >
| il me semble que c'est quand tu déclares un pointeur :
| std::map<Key, int>::iterator * iter;
|
| sans "typename", le caractère "*" est interprété comme une
| multiplication, et std::map<Key, int>::iterator comme un membre à
| multiplier.
| Pour que l'interprétation du source soit correcte, il faut préciser
| typename.


template<class T>
void f(int x) {
if (true) {
T::X(x); // #1
abs(x);
}
}

est-ce que la ligne #1 est une déclaration de variable ou un appel de
la fonction à T::X?

-- Gaby
Avatar
Thierry Noc
Matthieu Moy wrote:

template <typename Key>
inline void fn()
{
std::map<Key, int>::iterator iter;
typename std::map<Key, int>::iterator iter;




Bon ben je retourne a l'école. tchao et merci.


Avatar
Thierry Noc
Gabriel Dos Reis wrote:

template<class T>
void f(int x) {
if (true) {
T::X(x); // #1
abs(x);
}
}


Pourquoi t'a mis : if (true) {

Avatar
Repondre sur le NG

template<class T>
void f(int x) {
if (true) {
T::X(x); // #1
abs(x);
}
}

est-ce que la ligne #1 est une déclaration de variable ou un appel de
la fonction à T::X?
euh... je ne vois pas le rapport avec le problème précédent.

J'ai dit une bêtise ?

--
Stanislas RENAN

Avatar
Gabriel Dos Reis
Thierry Noc writes:

| Gabriel Dos Reis wrote:
| >
| > template<class T>
| > void f(int x) {
| > if (true) {
| > T::X(x); // #1
| > abs(x);
| > }
| > }
|
| Pourquoi t'a mis : if (true) {

un prétexte pour introduire un block ;-)

(et aussi pour dire « si c'était vrai » ;-)

-- Gaby
Avatar
Loïc Joly
Repondre sur le NG wrote:

template<class T>
void f(int x) {
if (true) {
T::X(x); // #1
abs(x);
}
}

est-ce que la ligne #1 est une déclaration de variable ou un appel de
la fonction à T::X?


euh... je ne vois pas le rapport avec le problème précédent.
J'ai dit une bêtise ?


Oui...

--
Loïc


Avatar
Gabriel Dos Reis
Repondre sur le NG writes:

|
| > template<class T>
| > void f(int x) {
| > if (true) {
| > T::X(x); // #1
| > abs(x);
| > }
| > }
| > est-ce que la ligne #1 est une déclaration de variable ou un appel de
| > la fonction à T::X?
| euh... je ne vois pas le rapport avec le problème précédent.

Le rapport est que ce n'est pas seulement dans le contexte de
déclaration de pointeur. Le message n'était pas une contradiction,
mais un complément d'information :-) Je remets du contexte :

# > (je ne sais plus exactement avec quoi il y a ambiguité, mais il faut
# > preciser au compilo que std::map<Key, int>::iterator est un type)
# >
# il me semble que c'est quand tu déclares un pointeur :
# std::map<Key, int>::iterator * iter;

-- Gaby
Avatar
Thierry Noc
Gabriel Dos Reis wrote:

| Pourquoi t'a mis : if (true) {

un prétexte pour introduire un block ;-)

(et aussi pour dire « si c'était vrai » ;-)



Ouf, ca vient pas d'une nouvelle norme ;)

1 2