2014-10-13 8 views
5

moje pytanie jest podobne do tego: How to publicly inherit from a base class but make some of public methods from the base class private in the derived class?, ale moja sprawa jest nieco bardziej skomplikowana, ponieważ chcę, aby zmienić dostęp dla przeciążonych funkcji/Szablon:C++ zmienić dostęp do funkcji składowej z przeciążenia

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 Wcześniej próbowałem metody z poprzedniej odpowiedzi, aby pewne funkcje publiczne, ale pojawia się ten błąd:

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

Jak mogę używać using aby tylko wybrane funkcje (1, 3 i 4), dostępny dla użytkowników Derived ?

Odpowiedz

6

Jak Armen i Jarod wskazał, using przyniesie wszystkie fun „s w klasie pochodnej. Jarod miał świetny pomysł: delete Zła funkcja! Łącząc ich odpowiedzi dostałem to:

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

który robi dokładnie to, co chciałem pierwotnie!

+0

+1 Uwielbiam, gdy OP wychodzi z najlepszą odpowiedzią! –

3

Można udostępnić wszystkie podmioty o nazwie fun lub żadnej z nich. Aby to zrobić, napisać:

public: 
    using Base::fun; 
+0

Czy nie jest możliwe zachowanie prywatnej gry zła (float) bez zmiany jej nazwy? – Felics

+0

@Felics: AFAIK, no. –

2

w twoim przypadku, masz do przekazania ręcznie using dzieła jako całości:

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); } 
}; 
Powiązane problemy