我有以下代码,它没有编译(编译器抱怨B :: fn无法访问)。
#include <iostream>
using namespace std;
template<typename T>
class B
{
public:
void fn(T &&obj)
{
cout<<"base version\n";
}
};
template<typename T>
class A : public B<T>
{
private:
using B<T>::fn;
public:
void fn(const T &obj)
{
cout<<"derived version\n";
}
};
int main()
{
A<int *> a;
a.fn(new int(5));
}
为了使代码有效,似乎我可以
void fn(T &&obj)
,或有谁能解释为什么我目前的代码不起作用,但上述方法有效吗?
[更新]:我认为B :: fn是私有的。我感到困惑的原因是class A : private B<T>
解决了这个问题。
答案 0 :(得分:4)
使用:
B<T>::fn
public
可见,但私有。
替换为using B<T>::fn;
,它也将公开。
如果您移除B<T>::fn
,则A::fn
会被A::fn
隐藏,
所以在主要电话中呼叫{{1}}。