 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Gabriel Dos Reis Guest
|
Posted: Thu Jul 10, 2003 7:09 am Post subject: Re: operator<<(char[T]) |
|
|
Vincent Richard <chere-loque.MARRE-DE-LA-PUB (AT) wanadoo (DOT) fr.invalid> writes:
| Quote: | template <int N
inline mon_stream& operator<<(char buf[N])
^^^^^^^^^^^ |
template
inline mon_stream& operator<<(char (&buf)[N])
-- Gaby
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu Jul 10, 2003 9:18 am Post subject: Re: operator<<(char[T]) |
|
|
Vincent Richard <chere-loque.MARRE-DE-LA-PUB (AT) wanadoo (DOT) fr.invalid> wrote
in message news:<3f0c5edb$0$5422$626a54ce (AT) news (DOT) free.fr>...
| Quote: | Je ne parviens pas à compiler le code suivant. g++ m'indique qu'il ne
trouve pas de correspondance pour la fonction "mon_stream << char[50]"
:
class mon_stream
{
public:
// erreur :
// no match pour l'opérateur << erreur interne de compilateur: ...
|
Ça ne doit pas être une erreur interne du compilateur, mais il y a bien
un problème dans ton code.
| Quote: | template
inline mon_stream& operator<<(char buf[N])
|
Tu n'utilises pas le paramètre de template N dans les paramètres de la
fonction. Ce que tu as écrit, c'est exactement l'équivant de :
template< int N >
inline mon_stream& operator<<( char* buf )
Je ne sais pas si c'est légale ; si ce l'est, la seule façon
de l'appeler alors serait m.operator<<< 50 >( ... ).
Ce que tu voulais, c'était probablement :
template< size_t N >
mon_stream& operator<<( char const (&buf)[ N ] ) ;
| Quote: | {
// ...code...
return (*this);
}
};
int main()
{
mon_stream m;
char texte[50];
m << texte;
// même problème avec :
// m.operator<<(texte);
//
// pas de fonction concordante pour l'appel à
// "mon_stream::operator<<(char[50])"
|
Pas de fonction, ou trop de fonctions ? Moi, j'en vois un infini :
toutes les instantiations possible de ta fonction template.
Je crois que :
mon_stream::operator<<< 50 >( texte ) ;
doit marcher. Mais d'une part, je ne suis pas sûr en ce qui concerne la
norme, et de l'autre, quoiqu'en dit la norme, j'ai comme une impression
que tu n'aurais pas de problème à trouver des compilateurs qui ne
l'acceptent pas.
| Quote: | }
Où est l'erreur ?
Encore un truc évident qui ne m'a pas sauté aux yeux ?
|
Évident, c'est rélatif. Pour ceux de nous qui sont venu de C, c'est
évident qu'un paramétre de type tableau n'existe pas -- c'est un défaut
ultra-connu du C, que C++ n'a pas pû éviter d'hériter. Pour ceux qui
n'ont pas connu toutes les horreurs de C, en revanche...
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Jul 13, 2003 3:30 pm Post subject: Re: operator<<(char[T]) |
|
|
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:
| Quote: | kanze (AT) gabi-soft (DOT) fr writes:
| > template <int N
| > inline mon_stream& operator<<(char buf[N])
| Tu n'utilises pas le paramètre de template N dans les
| paramètres de la fonction. Ce que tu as écrit, c'est
| exactement l'équivant de :
| template< int N
| inline mon_stream& operator<<( char* buf )
| Je ne sais pas si c'est légale ;
C'est tout ce qu'il y a de plus valide.
|
C'est ce qu'il me semblait, mais il ne l'était pas dans la
passée, et j'avoue que j'ai beaucoup de mal à savoir ce qui est
et ce qui n'est pas légal avec les templates d'aujourd'hui.
| Quote: | | si ce l'est, la seule façon
| de l'appeler alors serait m.operator<<< 50 >( ... ).
Yep.
|
Au fond, j'aime. Trois < de suite:-).
| Quote: | [...]
| > // même problème avec :
| > // m.operator<<(texte);
| > // pas de fonction concordante pour l'appel à
| > // "mon_stream::operator<<(char[50])"
| Pas de fonction, ou trop de fonctions ? Moi, j'en vois un infini :
| toutes les instantiations possible de ta fonction template.
Moi, je n'en vois aucune. Pour la simple raison qu'il n'en existe
pas. Le nom de la fonction qui conviendrait est operator<< -- pas
un template-id.
|
Là aussi, j'avoue que le surcharge avec des templates est trop
compliqué pour ma petite tête. Sa fonction était :
template< size_t N >
mon_stream&
operator<<( mon_stream&, char v[ N ] ) ;
Ce qui est exactement la même que :
template< size_t N >
mon_stream&
operator<<( mon_stream&, char* v ) ;
je crois. (Jusqu'à là, je me sens assez sûr.) Alors, devant
une expression du genre :
char a[ 50 ] ;
mon_stream << a ;
comment se fait la résolution du surcharge ? Surtout, comment le
compilateur décide-t-il quelles instantiations de template à
considérer ? Parce que ici aussi, c'est la même chose que :
mon_stream << &a[0] ;
non ? Et n'importe quelle instantiation de son template ferait
l'affaire.
--
James Kanze mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Sun Jul 13, 2003 5:21 pm Post subject: Re: operator<<(char[T]) |
|
|
James Kanze <kanze (AT) alex (DOT) gabi-soft.fr> writes:
| Quote: | |> | > // même problème avec :
|> | > // m.operator<<(texte);
|> | > // pas de fonction concordante pour l'appel à
|> | > // "mon_stream::operator<<(char[50])"
|> | Pas de fonction, ou trop de fonctions ? Moi, j'en vois un infini :
|> | toutes les instantiations possible de ta fonction template.
|> Moi, je n'en vois aucune. Pour la simple raison qu'il n'en existe
|> pas. Le nom de la fonction qui conviendrait est operator<< -- pas
|> un template-id.
Là aussi, j'avoue que le surcharge avec des templates est trop
compliqué pour ma petite tête. Sa fonction était :
template< size_t N
mon_stream&
operator<<( mon_stream&, char v[ N ] ) ;
Ce qui est exactement la même que :
template< size_t N
mon_stream&
operator<<( mon_stream&, char* v ) ;
je crois. (Jusqu'à là, je me sens assez sûr.)
|
Nous sommes tous d'accord.
Un premier point important à remarqer est que le paramètre template
« N », n'est pas déductible.
| Quote: | Alors, devant
une expression du genre :
char a[ 50 ] ;
mon_stream << a ;
comment se fait la résolution du surcharge ?
|
Avant résolution de surcharge, il y a d'abord recherche de noms,
déduction d'argument template et instantiations de template si
nécessaires. Voir 14.8.3/1
A function template can be overloaded either by (non-template) of
its name or by (other) function templates of the same name. When a
call to that name is written (explicitly, or implicitly using the
operator notation), template argument deduction (14.8.2) and
checking of any explicit template arguments (14.3) are performed
for each function template to find the template argument values (if
any) that can be used with that function template to instantiate a
function template specialization that can be invoked with the call
arguments. For each function template, if the argument deduction
and checking succeeds, the /template-arguments/ (deduced and/or
explicit) are used to instantiate a single function template
specialization which is added to the candidate functions set to be
used in overload resolution. If, for a given function template,
argument deduction fails, no such function is added to the set of
candidate functions for that template. The complete set of
candidate functions includes all the function templates instantiated
ini this way and all the non-template overloaded functions of the
same name. The function template specializations are treated like
any other functions in the remainder of overloaded resolution,
except as explicitly noted in 13.3.3.
Donc dans
mon_stream << a
le compilateur infère l'appel implicite d'une fonction appelable par
operator<< -- voir 13.3.1.2. On applique les règles de recherche de nom
habituelles qui nous donnent
template< size_t N >
mon_stream&
operator<<( mon_stream&, char v[ N ] ) ;
On passe à la phase « déduction d'argument template » qui échoue. Donc
l'ensemble des fonctions surchargées considérées dans l'expression
ci-haut est vide. C'est ce que disait le compilateur.
-- Gaby
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Jul 13, 2003 7:25 pm Post subject: Re: operator<<(char[T]) |
|
|
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:
| Quote: | James Kanze <kanze (AT) alex (DOT) gabi-soft.fr> writes:
| |> | > // même problème avec :
| |> | > // m.operator<<(texte);
| |> | > // pas de fonction concordante pour l'appel à
| |> | > // "mon_stream::operator<<(char[50])"
| |> | Pas de fonction, ou trop de fonctions ? Moi, j'en vois un
| |> | infini : toutes les instantiations possible de ta fonction
| |> | template.
| |> Moi, je n'en vois aucune. Pour la simple raison qu'il n'en
| |> existe pas. Le nom de la fonction qui conviendrait est
| |> operator<< -- pas un template-id.
| Là aussi, j'avoue que le surcharge avec des templates est
| trop compliqué pour ma petite tête. Sa fonction était :
| template< size_t N
| mon_stream&
| operator<<( mon_stream&, char v[ N ] ) ;
| Ce qui est exactement la même que :
| template< size_t N
| mon_stream&
| operator<<( mon_stream&, char* v ) ;
| je crois. (Jusqu'à là, je me sens assez sûr.)
Nous sommes tous d'accord. Un premier point important à
remarqer est que le paramètre template « N », n'est pas
déductible.
|
En effet. Je m'en rendais compte, mais je ne me rendais pas compte des
conséquences.
| Quote: | | Alors, devant
| une expression du genre :
| char a[ 50 ] ;
| mon_stream << a ;
| comment se fait la résolution du surcharge ?
Avant résolution de surcharge, il y a d'abord recherche de
noms, déduction d'argument template et instantiations de
template si nécessaires. Voir 14.8.3/1
A function template can be overloaded either by (non-template)
of its name or by (other) function templates of the same name.
When a call to that name is written (explicitly, or implicitly
using the operator notation), template argument deduction
(14.8.2) and checking of any explicit template arguments (14.3)
are performed for each function template to find the template
argument values (if any) that can be used with that function
template to instantiate a function template specialization that
can be invoked with the call arguments. For each function
template, if the argument deduction and checking succeeds, the
/template-arguments/ (deduced and/or explicit) are used to
instantiate a single function template specialization which is
added to the candidate functions set to be used in overload
resolution. If, for a given function template, argument
deduction fails, no such function is added to the set of
candidate functions for that template. The complete set of
candidate functions includes all the function templates
instantiated ini this way and all the non-template overloaded
functions of the same name. The function template
specializations are treated like any other functions in the
remainder of overloaded resolution, except as explicitly noted
in 13.3.3.
Donc dans
mon_stream << a
le compilateur infère l'appel implicite d'une fonction
appelable par operator<< -- voir 13.3.1.2. On applique les
règles de recherche de nom habituelles qui nous donnent
template< size_t N
mon_stream&
operator<<( mon_stream&, char v[ N ] ) ;
On passe à la phase « déduction d'argument template »
qui échoue. Donc l'ensemble des fonctions surchargées
considérées dans l'expression ci-haut est vide. C'est ce que
disait le compilateur.
|
Compris. Merci beaucoup de l'explication.
--
James Kanze mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|