Funktionsauflösung?
-
Hallo,
wieso erkennt der Compiler hier nicht, welche Funktion ich aufrufen möchte. Eigentlich ist es ja aufgrund des Argumentes eindeutig, was ich möchte...
class B { }; template<class> class C { }; class ABase1 { public: template<class A> static void Free(C<A>); }; class ABase2 { public: static void Free(B); }; class A: public ABase1,public ABase2 { }; int main() { B b; A::Free(b); }1>d:\projekte\test2\main.cpp(29) : error C2385: ambiguous access of 'Free'
1> could be the 'Free' in base 'ABase1'
1> or could be the 'Free' in base 'ABase2'
1>d:\projekte\test2\main.cpp(29) : error C2784: 'void ABase1::Free(C<<unnamed-symbol>>)' : could not deduce template argument for 'C<<unnamed-symbol>>' from 'B'
1> d:\projekte\test2\main.cpp(12) : see declaration of 'ABase1::Free'
-
überblicksmäßig gesagt: der compiler sucht zunächst, ob es in einer basisklasse einen passenden _namen_ gibt (name resolution), und wenn es einen gibt, und erst dann, kommt es zur überlagunsauflösung (overload resolution). dein compiler findet nun in zwei verschiedenen klassen denselben namen: Free.
jetzt gibt es aber eine mehrdeutigkeit in der namensauflösung, und bevor die overload resolution beginnt, meldet der compiler einen fehler.
lösung: führe die namen in das passende scope selbst ein.
class A : public ABase1, ABase2 { public: using ABase1::Free; using ABase2::Free; };