Templateklassen und Ableiten



  • hallo,

    VC2008 schluckt folgenden Code ohne Probleme, gcc 4.3.2 meckert dagegen.. Die Fehler habe ich in den Kommentaren dahinter geschrieben:

    template<class blub>class foo
    {
    public:
    	typedef blub fap;
    	template<class>void dub()
    	{
    	}
    };
    template<class blub>class bar:
    	public foo<blub>
    {
    public:
    	fap f;/*- expected ';' before 'f'
    			- expected nested-name-specifier  before 'fap'*/
    	bar()
    	{
    		dub<fap>();/*- expected primary-expression before ')' token
    					- 'fap' was not declared in this scope
    					- 'dub' was not declared in this scope*/
    	}
    };
    bar<int> b;
    

    Was entspricht nun dem Standard? Fehler oder kein Fehler?
    Gibt es eine besser Möglichkeit, als vor jedem vererbten Funktionsaufruf/Typen foo<blub>::(template ) vorzuschreiben?

    Danke!



  • Du hast prinzipiell zwei Möglichkeiten:
    1. typename bar::fap bzw. bar::template dub<fap>()
    2. einmalig typedef typename foo<blub>::fap; using foo<blub>::dub;

    Das entspricht dem Standard, da bei der Compiler sonst versucht im umgebendenen Namensraum versucht, die Symbole zu finden. Die Basisklasse kann vor der Instanziierung des Templates nicht genutzt werden, da noch eine Spezialisierung auftauchen könnte. Da wäre es ein Fehler, die Namen aus dem Template zu benutzen.


Anmelden zum Antworten