2015-10-12 67 views
0

我有以下一段代碼,它不能編譯(編譯器抱怨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)); 
} 

爲了使代碼的工作,看來我可以

  1. 定義一個單獨的void fn(T &&obj),在派生類中,或者,
  2. 使繼承的私人和使用訪問說明符做掉

任何人都可以請解釋爲什麼我目前的代碼不起作用,但上述方法呢?

[更新]:我強調B :: fn是私人的。我很困惑的原因是class A : private B<T>解決了這個問題。

+0

這個'private:使用B :: fn;'看起來非常像私人成員 - 不可訪問。它可能在'B'中公開,但是在'A'中是私有的。 –

+0

但是,當我作爲私人繼承時,爲什麼我不能得到同樣的投訴? – SPMP

回答

4

有:

private: 
using B<T>::fn; 

B<T>::fn是可見的,但私人。 替換爲public,它也會公開。

如果去掉using B<T>::fn;,該B<T>::fnA::fn隱藏, 所以在主呼叫A::fn呼叫。

+0

但是,當我繼承爲私人時,爲什麼我不能得到相同的投訴? – SPMP

+1

@ user2308211:它與私有繼承沒有任何關係,但是由於您不*使用'*'取消隱藏* B :: fn'。 – Jarod42