我的问题与此问题有关:How to publicly inherit from a base class but make some of public methods from the base class private in the derived class?,但我的情况稍微复杂一些,因为我想更改重载/模板函数的访问权限:
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
};
我已经尝试过上一个答案的方法来公开一些函数,但是我收到了这个错误:
ISO C++11 does not allow access declarations; use using declarations instead
如何使用using
仅为Derived
的用户提供所选功能(1,3和4)?
答案 0 :(得分:6)
正如Armen和Jarod所指出的那样,using
将把所有fun
带到派生类中。 Jarod虽然有一个好主意:delete
邪恶的功能!结合他们的答案,我得到了这个:
template<typename T1, typename T2>
class Derived : private Base<T1>
{
public:
using Base<T1>::fun;
void fun(float) = delete;
};
这正是我原本想要的!
答案 1 :(得分:3)
您可以创建名称为 fun 的所有实体,也可以不使用任何实体。为此,请写下:
public:
using Base::fun;
答案 2 :(得分:2)
在您的情况下,您必须手动转发using
作为一个整体:
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); }
};