Je suis tombé là dessus:
http://www-sop.inria.fr/galaad/personnel/gdr/C++/talks/type-of-toupper.pdf
Le code d'exemple:
#include <cctype> // int std::toupper(int)
#include <algorithm> // std::transform
#include <iostream> // std::cout
#include <ostream> // operator<<
int main()
{
char s[] = "tokra";
std::transform(&s[0], &s[0] + 5, &s[0],
std::toupper);
std::cout << s << std::endl;
}
l'erreur de compilation:
error: no matching function for call to `transform(char*, char*,
char*,
<unknown type>)'
Je pense avoir saisi le problème, encore que je pige pas
pourquoi VC++ 7.1 ne bronche pas.
J'ai quand même du mal à suivre, surtout la solution finale
proposée.
Alors j'ai 2 petites questions:
- Est-ce un problème spécifique à g++ ?
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
Je suis tombé là dessus:
http://www-sop.inria.fr/galaad/personnel/gdr/C++/talks/type-of-toupper.pdf
Le code d'exemple:
#include <cctype> // int std::toupper(int)
#include <algorithm> // std::transform
#include <iostream> // std::cout
#include <ostream> // operator<<
int main()
{
char s[] = "tokra";
std::transform(&s[0], &s[0] + 5, &s[0],
std::toupper);
std::cout << s << std::endl;
}
l'erreur de compilation:
error: no matching function for call to `transform(char*, char*,
char*,
<unknown type>)'
Je pense avoir saisi le problème, encore que je pige pas
pourquoi VC++ 7.1 ne bronche pas.
J'ai quand même du mal à suivre, surtout la solution finale
proposée.
Alors j'ai 2 petites questions:
- Est-ce un problème spécifique à g++ ?
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
Je suis tombé là dessus:
http://www-sop.inria.fr/galaad/personnel/gdr/C++/talks/type-of-toupper.pdf
Le code d'exemple:
#include <cctype> // int std::toupper(int)
#include <algorithm> // std::transform
#include <iostream> // std::cout
#include <ostream> // operator<<
int main()
{
char s[] = "tokra";
std::transform(&s[0], &s[0] + 5, &s[0],
std::toupper);
std::cout << s << std::endl;
}
l'erreur de compilation:
error: no matching function for call to `transform(char*, char*,
char*,
<unknown type>)'
Je pense avoir saisi le problème, encore que je pige pas
pourquoi VC++ 7.1 ne bronche pas.
J'ai quand même du mal à suivre, surtout la solution finale
proposée.
Alors j'ai 2 petites questions:
- Est-ce un problème spécifique à g++ ?
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
Je pense avoir saisi le problème, encore que je pige pas
pourquoi VC++ 7.1 ne bronche pas.
C'est une question de la qualité de l'implémentation:-).
Selon la norme, une implémentation peut inclure d'autres
en-têtes standard dans n'importe quel en-tête
standard. Dans une bonne implémentation, l'inclusion d'un
en-tête ne rendra visibles que ce qui doit être défini dans cet
en-tête. Mais ce n'est pas facile, et aucune implémentation n'y
arrive complètement. Ici, ce qui s'est passé, c'est qu'un des
en-têtes que tu as donné a inclu <locale> dans l'implémentation
g++ ; aucun ne l'a inclu dans l'implémentation VC++.
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
Dans la mésure qu'aucun compilateur aujourd'hui n'est conforme.
Avec simplement ::toupper, ça ne doit pas passer, selon la
norme. (Mais c'est peut-être une erreur dans la norme ; être
conforme à cet égard est assez difficile, et n'apporte
vraisemblablement que peu.)
Si tu remplaces <cctype> par <ctype.h>, la solution avectoupper devient conforme, et probablement portable.
Note cependant que si tu remplaces la chaîne constante ici par
une chaîne lue de l'extérieur, le programme qui en résulte a
probablement un comportement indéfini. C'est un deuxième
problème ; si Gaby n'en a pas parlé dans l'exposé que tu cites,
c'est qu'il n'avait pas d'importance par rapport au problème
dont il parlait. (Et je me tais du problème plus général, que la
transformation toupper sur place est impossible dans le cas
général, parce qu'il n'y a pas de bijection entre les
minuscules et les majuscules.)
Je pense avoir saisi le problème, encore que je pige pas
pourquoi VC++ 7.1 ne bronche pas.
C'est une question de la qualité de l'implémentation:-).
Selon la norme, une implémentation peut inclure d'autres
en-têtes standard dans n'importe quel en-tête
standard. Dans une bonne implémentation, l'inclusion d'un
en-tête ne rendra visibles que ce qui doit être défini dans cet
en-tête. Mais ce n'est pas facile, et aucune implémentation n'y
arrive complètement. Ici, ce qui s'est passé, c'est qu'un des
en-têtes que tu as donné a inclu <locale> dans l'implémentation
g++ ; aucun ne l'a inclu dans l'implémentation VC++.
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
Dans la mésure qu'aucun compilateur aujourd'hui n'est conforme.
Avec simplement ::toupper, ça ne doit pas passer, selon la
norme. (Mais c'est peut-être une erreur dans la norme ; être
conforme à cet égard est assez difficile, et n'apporte
vraisemblablement que peu.)
Si tu remplaces <cctype> par <ctype.h>, la solution avec
toupper devient conforme, et probablement portable.
Note cependant que si tu remplaces la chaîne constante ici par
une chaîne lue de l'extérieur, le programme qui en résulte a
probablement un comportement indéfini. C'est un deuxième
problème ; si Gaby n'en a pas parlé dans l'exposé que tu cites,
c'est qu'il n'avait pas d'importance par rapport au problème
dont il parlait. (Et je me tais du problème plus général, que la
transformation toupper sur place est impossible dans le cas
général, parce qu'il n'y a pas de bijection entre les
minuscules et les majuscules.)
Je pense avoir saisi le problème, encore que je pige pas
pourquoi VC++ 7.1 ne bronche pas.
C'est une question de la qualité de l'implémentation:-).
Selon la norme, une implémentation peut inclure d'autres
en-têtes standard dans n'importe quel en-tête
standard. Dans une bonne implémentation, l'inclusion d'un
en-tête ne rendra visibles que ce qui doit être défini dans cet
en-tête. Mais ce n'est pas facile, et aucune implémentation n'y
arrive complètement. Ici, ce qui s'est passé, c'est qu'un des
en-têtes que tu as donné a inclu <locale> dans l'implémentation
g++ ; aucun ne l'a inclu dans l'implémentation VC++.
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
Dans la mésure qu'aucun compilateur aujourd'hui n'est conforme.
Avec simplement ::toupper, ça ne doit pas passer, selon la
norme. (Mais c'est peut-être une erreur dans la norme ; être
conforme à cet égard est assez difficile, et n'apporte
vraisemblablement que peu.)
Si tu remplaces <cctype> par <ctype.h>, la solution avectoupper devient conforme, et probablement portable.
Note cependant que si tu remplaces la chaîne constante ici par
une chaîne lue de l'extérieur, le programme qui en résulte a
probablement un comportement indéfini. C'est un deuxième
problème ; si Gaby n'en a pas parlé dans l'exposé que tu cites,
c'est qu'il n'avait pas d'importance par rapport au problème
dont il parlait. (Et je me tais du problème plus général, que la
transformation toupper sur place est impossible dans le cas
général, parce qu'il n'y a pas de bijection entre les
minuscules et les majuscules.)
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
Bon ben en fait je pige plus rien car sans :: (toupper tout court) ça marche
aussi.
std::transform(&s[0], &s[0] + 5, &s[0], toupper);
D'après ce que je sais, c'est grâce au Koenig Lookup. Toujours d'apres ce
que je sais, le Koenig Lookup c'est comme si j'avais écris:
std::transform(&s[0], &s[0] + 5, &s[0], std::toupper);
car transform est dans std::
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
Bon ben en fait je pige plus rien car sans :: (toupper tout court) ça marche
aussi.
std::transform(&s[0], &s[0] + 5, &s[0], toupper);
D'après ce que je sais, c'est grâce au Koenig Lookup. Toujours d'apres ce
que je sais, le Koenig Lookup c'est comme si j'avais écris:
std::transform(&s[0], &s[0] + 5, &s[0], std::toupper);
car transform est dans std::
- j'ai remarqué que le g++ se plaint si on met "std::toupper"
ou "toupper", mais si on fait référence au namespace global
"::toupper" ça passe. Est-ce une bonne solution de
contournement ?
Bon ben en fait je pige plus rien car sans :: (toupper tout court) ça marche
aussi.
std::transform(&s[0], &s[0] + 5, &s[0], toupper);
D'après ce que je sais, c'est grâce au Koenig Lookup. Toujours d'apres ce
que je sais, le Koenig Lookup c'est comme si j'avais écris:
std::transform(&s[0], &s[0] + 5, &s[0], std::toupper);
car transform est dans std::
Je pense avoir saisi le problème, encore que je pige pas
pourquoi VC++ 7.1 ne bronche pas.
C'est une question de la qualité de l'implémentation:-).
Selon la norme, une implémentation peut inclure d'autres
en-têtes standard dans n'importe quel en-tête standard. Dans
une bonne implémentation, l'inclusion d'un en-tête ne rendra
visibles que ce qui doit être défini dans cet en-tête. Mais
ce n'est pas facile, et aucune implémentation n'y arrive
complètement. Ici, ce qui s'est passé, c'est qu'un des
en-têtes que tu as donné a inclu <locale> dans
l'implémentation g++ ; aucun ne l'a inclu dans
l'implémentation VC++.
Effectivement <locale> n'est pas inclus, mais ça ne suffit
pas. Si je l'inclut (avec <cctype>) ça marche quand même.
Si j'inclus seulement <locale> sans <cctype> alors là "c'est
bon" il râle:
impossible de déduire l'argument de modèle de 'T2' à partir de
'char
*__w64 '
impossible d'utiliser le modèle de fonction '_Elem
std::toupper(_Elem,const std::locale &)' comme argument de fonction
En fait je trouve ça normal que ça passe : vu que y'a 2
surcharges de dispo et que l'une d'entre elle (non template en
plus, donc privilégiée dans la recherche non ?) fonctionne, je
pige pas pourquoi g++ se plaint.
Note cependant que si tu remplaces la chaîne constante ici
par une chaîne lue de l'extérieur, le programme qui en
résulte a probablement un comportement indéfini. C'est un
deuxième problème ; si Gaby n'en a pas parlé dans l'exposé
que tu cites, c'est qu'il n'avait pas d'importance par
rapport au problème dont il parlait. (Et je me tais du
problème plus général, que la transformation toupper sur
place est impossible dans le cas général, parce qu'il n'y a
pas de bijection entre les minuscules et les majuscules.)
Par comportement indéfini, tu fais allusion à l'histoire des
majuscules / minuscules dans certaines langues comme
l'allemand ?
Je pense avoir saisi le problème, encore que je pige pas
pourquoi VC++ 7.1 ne bronche pas.
C'est une question de la qualité de l'implémentation:-).
Selon la norme, une implémentation peut inclure d'autres
en-têtes standard dans n'importe quel en-tête standard. Dans
une bonne implémentation, l'inclusion d'un en-tête ne rendra
visibles que ce qui doit être défini dans cet en-tête. Mais
ce n'est pas facile, et aucune implémentation n'y arrive
complètement. Ici, ce qui s'est passé, c'est qu'un des
en-têtes que tu as donné a inclu <locale> dans
l'implémentation g++ ; aucun ne l'a inclu dans
l'implémentation VC++.
Effectivement <locale> n'est pas inclus, mais ça ne suffit
pas. Si je l'inclut (avec <cctype>) ça marche quand même.
Si j'inclus seulement <locale> sans <cctype> alors là "c'est
bon" il râle:
impossible de déduire l'argument de modèle de 'T2' à partir de
'char
*__w64 '
impossible d'utiliser le modèle de fonction '_Elem
std::toupper(_Elem,const std::locale &)' comme argument de fonction
En fait je trouve ça normal que ça passe : vu que y'a 2
surcharges de dispo et que l'une d'entre elle (non template en
plus, donc privilégiée dans la recherche non ?) fonctionne, je
pige pas pourquoi g++ se plaint.
Note cependant que si tu remplaces la chaîne constante ici
par une chaîne lue de l'extérieur, le programme qui en
résulte a probablement un comportement indéfini. C'est un
deuxième problème ; si Gaby n'en a pas parlé dans l'exposé
que tu cites, c'est qu'il n'avait pas d'importance par
rapport au problème dont il parlait. (Et je me tais du
problème plus général, que la transformation toupper sur
place est impossible dans le cas général, parce qu'il n'y a
pas de bijection entre les minuscules et les majuscules.)
Par comportement indéfini, tu fais allusion à l'histoire des
majuscules / minuscules dans certaines langues comme
l'allemand ?
Je pense avoir saisi le problème, encore que je pige pas
pourquoi VC++ 7.1 ne bronche pas.
C'est une question de la qualité de l'implémentation:-).
Selon la norme, une implémentation peut inclure d'autres
en-têtes standard dans n'importe quel en-tête standard. Dans
une bonne implémentation, l'inclusion d'un en-tête ne rendra
visibles que ce qui doit être défini dans cet en-tête. Mais
ce n'est pas facile, et aucune implémentation n'y arrive
complètement. Ici, ce qui s'est passé, c'est qu'un des
en-têtes que tu as donné a inclu <locale> dans
l'implémentation g++ ; aucun ne l'a inclu dans
l'implémentation VC++.
Effectivement <locale> n'est pas inclus, mais ça ne suffit
pas. Si je l'inclut (avec <cctype>) ça marche quand même.
Si j'inclus seulement <locale> sans <cctype> alors là "c'est
bon" il râle:
impossible de déduire l'argument de modèle de 'T2' à partir de
'char
*__w64 '
impossible d'utiliser le modèle de fonction '_Elem
std::toupper(_Elem,const std::locale &)' comme argument de fonction
En fait je trouve ça normal que ça passe : vu que y'a 2
surcharges de dispo et que l'une d'entre elle (non template en
plus, donc privilégiée dans la recherche non ?) fonctionne, je
pige pas pourquoi g++ se plaint.
Note cependant que si tu remplaces la chaîne constante ici
par une chaîne lue de l'extérieur, le programme qui en
résulte a probablement un comportement indéfini. C'est un
deuxième problème ; si Gaby n'en a pas parlé dans l'exposé
que tu cites, c'est qu'il n'avait pas d'importance par
rapport au problème dont il parlait. (Et je me tais du
problème plus général, que la transformation toupper sur
place est impossible dans le cas général, parce qu'il n'y a
pas de bijection entre les minuscules et les majuscules.)
Par comportement indéfini, tu fais allusion à l'histoire des
majuscules / minuscules dans certaines langues comme
l'allemand ?