Bonjour,
J'ai un splendide bout de code qui ne compile pas, et je souhaite vraiment vous en faire part :
Il y a une erreur à la ligne instance.f(42) qui dit :
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); }
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)error: no matching function for call to ‘B::f(int)’
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part instance.A::f(42);
Partager