Le langage SMS est exclu sur les forums ProgBoards, tout message ne respectant pas la charte sera déplacé, modifié, ou supprimé par nos modérateurs.

Forum Langages » C & Cie. » [C++] template et héritage

Francesco
Modérateur
Citer Windows NT Firefox 3 - Posté le 01/12/2008 à 22:49
Bonsoir à tous,

J'ai un ch'tit problème, qui m'enquiquine plutot.


class String
{
int bidule;
};

template<class Index, class T_Object>
class Map
{
public:
bool isIndex(const Index& index) const;
};

template<class T_Object>
class StringMap : public Map<String, T_Object>
{
public:
bool isIndex(const char* index) const;
};

int main()
{
StringMap<int> map;
String str;
map.isIndex(str);
return 0;
}



Ce code provoque des erreurs de compilations :
- sous GCC :

test2.cxx: In function `int main()':
test2.cxx:24: error: no matching function for call to `StringMap<int>::isIndex(String&)' test2.cxx:17: note: candidates are: bool StringMap<T_Object>::isIndex(const char*) const [with T_Object = int]


-sous Visual Studio C++:

test2.cxx
test2.cxx(24) : error C2664: 'StringMap<T_Object>::isIndex' : impossible de conv
ertir le paramètre 1 de 'String' en 'const char *'
with
[
T_Object=int
]
Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé



Donc, en gros, la méthode défini dans ma classe mère isIndex(const String) const, n'est pas "vue" depuis la classe fille. Et là, j'avoue que je sèche complètement sur le pourquoi du comment. Sans doute lié à l'utilisation des templates, mais c'est bien la première fois que j'ai cette erreur ! Et pourtant, j'en use des templares (héhé)

Et je ne pense pas que cela soi du à un bug du compilateur, puisque 2 compilateurs différents m'indiquent la même erreur.

Des idées pour résoudre ce problème ?

Merci !
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Francesco
Modérateur
RemonterCiter Windows NT Firefox 3 - Posté le 01/12/2008 à 23:11
En changeant mes mots clé sous Google, j'ai fini par trouver la réponse à ma question !


class String
{
int bidule;
};

template<class Index, class T_Object>
class Map
{
public:
bool isIndex(const Index& index) const;
};

template<class T_Object>
class StringMap : public Map<String, T_Object>
{
typedef Map<String, T_Object> Super;

public:
using Super::isIndex;
bool isIndex(const char* index) const;
};

int main()
{
StringMap<int> map;
String str;
map.isIndex(str);
return 0;
}



Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)

Poster une réponse

STOP aux fautes volontaires !
Message
Formatage
Note: pour partager du code source, merci d'utiliser le wall !
Smileys (sourire) (yekyek) (clein d'oeil) (désapprouve) (triste) (cool) (langue) (confus) (gêné) (neutre) (eek) (surpris) (diable) (flèche) (exclamation) (question) (diable) (idée) (méchant)
Pseudonyme
Recopiez le code
v6 © Computaid SPRL 2005-2012 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,025 s - Crédits - Stats
1 connecté