Eigenartiges Verhalten bei private-Vererbung



  • Hallo,

    seht euch mal folgendes destilliertes Klassenkonstrukt an:

    class Uncopyable
    {
    private:
    	Uncopyable( const Uncopyable& );
    	Uncopyable& operator=( const Uncopyable& );
    
    public:
    	Uncopyable()	{}
    	~Uncopyable()	{}
    };
    
    template <class T>
    class Singleton : private Uncopyable
    {
    private:
    	Singleton( Singleton& )	{}
    
    protected:
    	Singleton();
    
    public:
    	virtual ~Singleton();
    };
    
    class Input : public Singleton<Input>
    {
    	friend class Singleton<Input>;
    
    private:
    	Input();
    
    public:
    	~Input();
    
    	class InputDispatcher : private Uncopyable
    	{
    	public:
    		InputDispatcher()			{}
    		virtual ~InputDispatcher()	{}
    	};
    };
    

    Weiß jemand, warum ich hier in Zeile 37 folgenden Fehler bekomme?

    MSVC2005 SP1 Compiler schrieb:

    Error 1 error C2247: 'Uncopyable' not accessible because 'Singleton<T>' uses 'private' to inherit from 'Uncopyable' c:\...\test\main.cpp

    Die nested class InputDispatcher hat doch mit Singleton nix zu tun, ich möchte sie nur von Uncopyable ableiten, nichts weiter. Compilerfehler/-schwäche?

    *edit*
    Wenn ich Singleton nicht von Uncopyable ableite gehts, btw, eh klar...



  • ::Uncopyable funktioniert.

    100% erklären kann ich es nicht... sieht so aus, als würde er bei der Suche zuerst in die Klasse (und ihre drüber liegende Hierarchie) "schauen"? Ein ::Uncopyable macht ihm klar wo er suchen soll?


  • Mod

    iko79 schrieb:

    Die nested class InputDispatcher hat doch mit Singleton nix zu tun, ich möchte sie nur von Uncopyable ableiten, nichts weiter. Compilerfehler/-schwäche?

    Eine Folge des unqualifizierten Namelookups in Verbindung mit der Definition einer verschachtelten Klassendefinition.
    1. Bei der Angabe der Basisklasse InputDispatcher wird zunächst der Scope von InputDispatcher durchsucht, dort ist dieser Name nicht zu finden (jede folgende Erwähnung von Uncopyable in diesem Scope würde aber hier enden).
    2. Anschließend wird der Scope der umliegenden Klasse Input durchsucht. Auch dort ist der Name nicht zu finden.
    3. Anschließend werden alle Basisklassen von Input durchsucht. Uncopyable ist (als Basisklasse von Singleton<Input>) ein Member einer Basisklasse von Input. Der unqualifizierte Namelookup endet also hier, wir kommen gar nicht dazu, im umliegenden Namensraum zu suchen.

    Anschließend erfolgt dann die Überprüfung von Zugriffsrechten, und daran scheitern wir, denn da Uncopyable eine private Basisklasse von Singleton<Input> ist, haben wir in InputDispatcher keinen Zugriff darauf.



  • @ihoernchen: Danke!

    @camper: Ebenfalls danke! Irgendsowas hab i mir scho zusammengesponnen, trotzdem find ichs merkwürdig: Sollte der Compilier nicht nach Klassendefinitionen suchen? Im Scope "Input" ist ja definitiv keine *Klasse* mit dem Namen Uncopyable vorhanden, sie leitet nur davon ab. Das einzige, was dort gefunden werden kann ist imho der Basis-Konstruktor mit dem Namen Uncopyable. Und dass ich den nicht als Basisklasse verwenden kann ist klar -- in dem Fall müsste die Fehlermeldung etwas anders aussehen, oder nicht? Bin ja jetzt kein Compiler-Entwickler, gerade deshalb find ich's vermutlich unlogisch...?


Anmelden zum Antworten