Blog Technique Menu


Langage C++

Il y a un moment, j'écrivais un bout de code C++ et je me suis retrouvé face à un problème étrange:

 

#include <iostream>
 
class A
{
protected:
void some_func(const unsigned int& param1)
{
std::cout << "A::some_func(" << param1 << ")" << std::endl;
}
public:
virtual ~A() {}
 virtual void some_func(const unsigned int& param1, const char*)
{
some_func(param1);
}
};
 
class B : public A
{
public:
virtual ~B() {}
 virtual void some_func(const unsigned int& param1, const char*)
{
some_func(param1);
}
};
 
int main(int, char**)
{
A* t = new B();
t->some_func(42, "some char*");
 return 0;
}

 

et la réponse fut immédiate :

 

$ g++ -W -Wall -Werror test.cc
test.cc: In member function ‘virtual void B::some_func(const unsigned int&, const char*)’:
test.cc:24: error: no matching function for call to ‘B::some_func(const unsigned int&)’
test.cc:22: note: candidates are: virtual void B::some_func(const unsigned int&, const char*)

 

Je me suis demandé le pourquoi du comment et j'en étais même au point de douter de mon g++. Après une heure de bidouille, j'ai décidé de regarder dans le standard C++ et quelle fût ma surprise, g++ n'était pas en faute mais bon, comme on le dit souvent, le problème se trouve entre le clavier et la chaise. J'ai donc trouvé dans le paragraphe 10.2 du standard l'explication de mon problème :

En effet, le paragraphe sur la résolution des symboles précise très clairement que la redéfinition d'une méthode dans une classe dérivée va cacher toutes les méthodes avec le même nom plus haut dans la hiérarchie.

 

Le seul moyen de régler ce problème est donc de préciser quelle fonction on veut appeler c'est à dire A::some_func(…)