Code :
- #include <iostream>
- using namespace std;
- template <typename Type>
- class reel
- {
- public:
- Type date;
- void f(Type arg)
- {
- cout << arg << endl;
- }
- };
- template <typename Type1,typename Type2>
- class A:public reel<Type1>,public reel<Type2>
- {
- using reel<Type1>::f;
- using reel<Type2>::f;
- };
- int main()
- {
- A<float,double> b;
- b.f(3.0f);
- }
|
Le choix de la fonction à appeler se fait en trois temps. Premièrement, la determination d'une portée ou trouver la fonction, deuxièmement résolution de la surcharge, troisièmement, contrôle d'accès.
Ici, l'ambiguïté est dans la première étape. Pour la résoudre, j'importe les noms dans la classe A donc il n'y a plus d'ambiguité de portée -- et la résolution de surcharge fonctionne comme on s'y attends. Mais donne une erreur puisque les fonctions ne sont pas accessible -- donc j'ai ajouté le public.
C'est un effet de la même règle, mais un peu plus subtil, qui empèche le code suivant de compiler
Code :
- struct A { void f(double*) {} };
- struct B: A { void f(int*) {}};
- int main() {
- B b;
- b.f((double*)0);
- }
|
Message édité par Un Programmeur le 24-01-2009 à 20:07:21