Bonjour,

J'ai un splendide bout de code qui ne compile pas, et je souhaite vraiment vous en faire part :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
public:
  virtual void f(int i){}
};
 
class B : public A
{
public:
  void f(int i, int j){}
};
 
int main(int argc, char *argv[]){
  B instance;
  instance.f(42);
}
Il y a une erreur à la ligne instance.f(42) qui dit :
error: no matching function for call to ‘B::f(int)’
Je me dis qu'il est naturel que lorsque on appelle B::f(int), le compilo aille chercher la déclaration de la classe A (ou procède récursivement jusqu'à trouver une classe déclarant le bon prototype)

Sauf que ce n'est pas le cas. Et je voudrais savoir quelles sont les raisons qui ont poussé à cela

Car, il ne me semble pas que ce soit affreux du point de vue design : on a une fonction qui renvoie des informations. Plus on se spécialise, plus on peut renvoyer des infos pertinentes, et on dispose de choix plus variés pour poser nos questions (i.e : on a plus de prototypes à notre disposition)

Je ne suis pas arrivé à trouver ma réponse sur Google, donc je m'adresse à vous!

P.S : Je ne cherche pas un workaround, honnêtement, il y a 100 façons de procéder autrement. Je veux juste savoir pourquoi les hautes instances du C++ ont décidé de limiter la portée des appels

Edit : Je persiste, je ne comprend pas pourquoi je dois faire appel à l'opérateur de résolution de portée alors qu'il n'y a pas d'ambiguïtés sur le prototype de la fonction...
Ca veut dire que la ligne suivante fonctionne :