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

Erreur de link bizarre

6 réponses
Avatar
Guillaume GOURDIN
Bonjour à tous, j'ai implémenté une calsse de string de la manière suivante:

class my_string
{
public:
my_string();
my_string(char c);
my_string(wchar_t c);
my_string(const my_string & string);
my_string(const char * string);
my_string(const wchar_t * string);

my_string operator+(const my_string & string) const;
};

Le problème, c'est qu'avec le code suivant:

my_string s, s1;
s = s1 + 't';

j'ai une erreur de link que je ne m'explique pas:

error: ambiguous overload for ‘operator+’
note: candidates are: operator+(const wchar_t*, long int) <built-in>
my_string my_string::operator+(const my_string&) const

J'ai l'impression que le compilateur implémente un constructeur par défaut:

my_string(const wchar_t * string, long int)

et je vois pas pourquoi il le ferait. Vous avez des explications ?

6 réponses

Avatar
Guillaume GOURDIN
J'ai l'impression que le compilateur implémente un constructeur par défaut:

my_string(const wchar_t * string, long int)


Oups. Je voulais dire que j'ai l'impression qu'il implémente l'operateur

operator+(const wchar_t*, long int)

Avatar
Fabien LE LEZ
On Fri, 04 Jan 2008 17:12:59 +0100, Guillaume GOURDIN
:

error: ambiguous overload for ‘operator+’
note: candidates are: operator+(const wchar_t*, long int) <built-in>


N'aurais-tu pas un "operator const wchar_t*()" dans ta classe
"my_string" ?

j'ai une erreur de link que je ne m'explique pas:


Qué "link" ?
C'est une erreur de compilation, ça, non ?

Avatar
Sylvain Togni

class my_string
{
public:
my_string();
my_string(char c);
my_string(wchar_t c);
my_string(const my_string & string);
my_string(const char * string);
my_string(const wchar_t * string);

my_string operator+(const my_string & string) const;
};

Le problème, c'est qu'avec le code suivant:

my_string s, s1;
s = s1 + 't';

j'ai une erreur de link que je ne m'explique pas:

error: ambiguous overload for ‘operator+’
note: candidates are: operator+(const wchar_t*, long int) <built-in>
my_string my_string::operator+(const my_string&) const


La classe my_string n'aurait pas un opérateur de conversion
vers const wchar_t*, par hasard ?

--
Sylvain Togni

Avatar
Guillaume GOURDIN
La classe my_string n'aurait pas un opérateur de conversion
vers const wchar_t*, par hasard ?


Tout à fait. Tu as une explication ?

Avatar
Fabien LE LEZ
On Fri, 04 Jan 2008 17:14:30 +0100, Guillaume GOURDIN
:

Oups. Je voulais dire que j'ai l'impression qu'il implémente l'operateur

operator+(const wchar_t*, long int)


Cet opérateur existe bien évidemment, même en C : on peut ajouter un
entier à un pointeur pour le déplacer à l'intérieur d'un tableau.

int const t[]= { 1, 2, 3 };
int const* ptr1= t; // ptr1 pointe sur "1"
int const* ptr2= ptr1 + 2; // ptr2 pointe sur "3"

Avatar
Fabien LE LEZ
On Fri, 04 Jan 2008 17:48:11 +0100, Guillaume GOURDIN
:

Tout à fait. Tu as une explication ?


L'explication t'a été donnée par le compilateur.

Tu écris
s1 + 't';

s1 est de type "my_string", et peut être converti en un wchar_t const*

t est de type "char", et peut être converti en un type numérique (int
ou long int)

Il n'y a pas d'opérateur
operator+ (my_string, char);
ni d'opérateur
my_string::operator+ (char);

Il faut donc effectuer une conversion implicite sur les arguments, et
regarder les fonctions qui correspondent.

D'après le compilo, deux fonctions correspondent :

error: ambiguous overload for ‘operator+’
note: candidates are: operator+(const wchar_t*, long int) <built-in>
my_string my_string::operator+(const my_string&) const

Le compilateur ne sachant pas laquelle choisir (aucune règle du
langage ne privilégie l'une par rapport à l'autre), il ne peut pas
compiler, et renvoie un message d'erreur.

Par contre, si tu écris

s1 - 't';

le programme devrait compiler sans problème :-p



Note que std::string n'a pas d'opérateur de conversion vers
"char const*" ; c'est justement pour éviter ce genre de problème.