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;
    };
    

Anmelden zum Antworten