Frage zu pointer-to-member



  • Hi,

    ok gleich mal ein bisschen Code zu Beginn

    class bar
    {
    public:
    	void baz()
    	{
    	}
    };
    
    template <class T, class C>
    void foo(T C::*)
    {
    }
    
    int main()
    {
    	foo(&bar::baz);
    }
    

    Der MSC kompiliert das problemlos. Der GCC hingegen weigert sich, weil kein passendes foo vorhanden wäre. Wer hat nun Recht?
    Ich tendiere ja eher zu GCC, kann im Standard aber nichts darüber finden, dass hier keine member function pointer erlaubt wären.


  • Mod

    das ist ja auch kein pointer-to-member-function sondern einfach nur ein pointer-to-member in der definition von foo. da müssten schon noch ein paar klammern dazu damit es funktioniert.

    template <class T, class C>
    void foo(T (C::*)())
    {
    }
    

    oder einfach nur

    template <class T>
    void foo(T)
    {
    }
    


  • camper schrieb:

    oder einfach nur

    template <class T>
    void foo(T)
    {
    }
    

    Das nützt mir nix, da man ja dann alles mögliche übergeben kann.

    camper schrieb:

    das ist ja auch kein pointer-to-member-function

    Hab ich ja auch nicht behauptet, bitte Threadtitel nochmal genau lesen. Ich sag nur, dass der MSC auch member function pointer akzeptiert. In diesem Fall mit T=void(), C=bar. Meine Frage ist halt, ob dies zulässig ist, bzw welcher Compiler sich da korrekt verhält



  • Ok, hab das ganze noch mit Digital Mars und Borland 5.5 Compiler getestet. Beide verhalten sich wie der MSC, also kompilieren ohne zu meckern. Trotzdem bleibt mir das ganze etwas suspekt...


  • Mod

    bei gcc klappt es, wenn man ihm einen typ direkt angibt: foo<void()>(&bar::baz) - ist also möglicherweise doch eine fehler von gcc und nicht msvc. die online version von comeau c++ akzeptiert deinen code auch.


Anmelden zum Antworten