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

template et operateur de cast

1 réponse
Avatar
Guillaume GOURDIN
Bonjour à tous,

j'ai dans mon code la fonctino suivante :

template <class T> void Mem_Copy(T * out, const T * in, int count)

et la classe

template<class T>
class LiwBuffer
{
public:
operator T * ();
operator const T * () const;

...
};

Et quand je tape :

uint16_t * out;
LiwBuffer<uint16_t> buffer;
Mem_Copy( out, buffer, size );

J'ai une erreur de compilation sur le Mem_Copy:

error: no matching function for call to ‘Mem_Copy(uint16_t*,
LiwBufferUInt16&, int)’

Je ne comprends pas pourquoi l'operateur de cast n'est pas appelé ici...
Quelqu'un a t'i une idée?

Merci!

1 réponse

Avatar
Fabien LE LEZ
On Fri, 23 May 2008 11:47:17 +0200, Guillaume GOURDIN :

Je ne comprends pas pourquoi l'operateur de cast n'est pas appelé ici...


Si tu avais une fonction

void Mem_Copy_2 (uint16_t * out, const uint16_t * in, int count);

ce serait le cas.

Mais Mem_Copy<T> est un template. Il faut donc, avant de se préoccuper
de l'appel proprement dit, savoir quel est le type T.

De deux choses l'une :

- soit tu l'indiques explicitement, et tout va bien :

Mem_Copy<uint16_t> ( out, buffer, size );

- soit tu laisses le compilateur s'en charger, et choisir un T tel que
tous les arguments correspondent exactement (c'est-à-dire, sans cast
implicite).

En d'autres termes, il faut trouver T tel que :
T * == uint16_t *
et
T const * == LiwBuffer<uint16_t>

Ce n'est pas possible sans cast, donc le compilo refuse.