C++ C++;使用重载更改成员函数的访问权限

C++ C++;使用重载更改成员函数的访问权限,c++,c++11,c++14,C++,C++11,C++14,我的问题与此相关:,但我的情况稍微复杂一些,因为我想更改重载/模板函数的访问权限: template<typename T> class Base { public: void fun(int); //1 void fun(float); //2 void fun(T); //3 template<typename U> //4

我的问题与此相关:,但我的情况稍微复杂一些,因为我想更改重载/模板函数的访问权限:

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 
};

如何使用
use
仅使所选函数(1、3和4)可供
派生的用户使用?

您可以使名称为fun的所有实体可用,也可以不使用任何实体。为此,请写:

public:
     using Base::fun;

在您的情况下,您必须手动转发,因为
使用
作为一个整体工作:

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); }
};
模板
派生类:私有基
{
公众:
void fun(int i){Base::fun(i);}
//不要显示void fun(float);因此fun(float)将调用模板方法
//或通过删除该函数来禁止娱乐(浮动)
//无效乐趣(浮动)=删除;
void-fun(t){Base::fun(t);}
模板void fun(U){Base::fun(U);}
};

正如Armen和Jarod指出的,
使用
将给派生类带来所有的
乐趣。Jarod有一个好主意:
删除
邪恶的功能!结合他们的答案,我得出了以下结论:

template<typename T1, typename T2>
class Derived : private Base<T1>
{
    public:
        using Base<T1>::fun;
        void fun(float) = delete;
};
模板
派生类:私有基
{
公众:
使用Base::乐趣;
无效乐趣(浮动)=删除;
};

这正是我最初想要的

难道不可能在不改变名字的情况下保留邪恶乐趣(浮动)一号的隐私吗?+1当OP想出最好的答案时,我喜欢它!
template<typename T1, typename T2>
class Derived : private Base<T1>
{
    public:
        using Base<T1>::fun;
        void fun(float) = delete;
};