2014-10-13 13 views
5

Meine Frage mit Überlastung Member-Funktion ändern, um diese in Beziehung steht: How to publicly inherit from a base class but make some of public methods from the base class private in the derived class?, aber mein Fall ist ein wenig komplexer, als ich den Zugang für überlastet/Template-Funktionen ändern möchten:C++ Zugang für

template<typename T> 
class Base 
{ 
    public: 
     void fun(int);   //1 
     void fun(float);  //2 

     void fun(T);   //3 

     template<typename U> //4 
     void fun(U); 
}; 

template<typename T1, typename T2> 
class Derived : private Base<T1> 
{ 
    public: 
     //change access specifier here for: 
     //1 - make fun(int) available 
     //2 - fun(float) is really evil and it should not be accessible! 
     //3 - make fun(T1) == Base::fun(T) available 
     //4 - make template<typename U> void Base::fun(U) available 
}; 

I habe das Verfahren aus früheren Antwort versucht, eine Funktion öffentlich zu machen, aber ich habe diesen Fehler:

ISO C++11 does not allow access declarations; use using declarations instead 

Wie ich using kann nur die ausgewählten Funktionen (1, 3 und 4) für die Nutzer von Derived machen ?

Antwort

6

Wie Armen und Jarod wies darauf hin, using bringt alle fun ‚s in der abgeleiteten Klasse. Jarod hatte aber eine tolle Idee: delete die böse Funktion! Kombinieren ihre Antworten habe ich das:

template<typename T1, typename T2> 
class Derived : private Base<T1> 
{ 
    public: 
     using Base<T1>::fun; 
     void fun(float) = delete; 
}; 

was genau das tut, was ich ursprünglich wollte!

+0

+1 Ich liebe es, wenn das OP mit der besten Antwort kommt! –

3

Sie können entweder alle Entitäten mit dem Namen fun verfügbar machen, oder keine davon. Dazu schreiben:

public: 
    using Base::fun; 
+0

Ist es nicht möglich, den bösen Spaß (float) privat zu halten, ohne seinen Namen zu ändern? – Felics

+0

@Felics: AFAIK, nein. –

2

In Ihrem Fall müssen Sie manuell als using Werke als Ganzes weiter:

template<typename T1, typename T2> 
class Derived : private Base<T1> 
{ 
public: 
    void fun(int i) { Base<T1>::fun(i); } 

    // Don't show void fun(float); so fun(float) will call the template method 
    // or forbid fun(float) by deleting the function 
    // void fun(float) = delete; 

    void fun(T1 t) { Base<T1>::fun(t); } 

    template<typename U> void fun(U u) { Base<T1>::fun(u); } 
};