我有以下一段代碼,它不能編譯(編譯器抱怨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>
解決了這個問題。
這個'private:使用B :: fn;'看起來非常像私人成員 - 不可訪問。它可能在'B'中公開,但是在'A'中是私有的。 –
但是,當我作爲私人繼承時,爲什麼我不能得到同樣的投訴? – SPMP