访问说明符和右值引用

时间:2015-10-12 22:47:10

标签: c++ c++11

我有以下代码,它没有编译(编译器抱怨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. 将继承设为私有,并取消访问说明符
  3. 有谁能解释为什么我目前的代码不起作用,但上述方法有效吗?

    [更新]:我认为B :: fn是私有的。我感到困惑的原因是class A : private B<T>解决了这个问题。

1 个答案:

答案 0 :(得分:4)

使用:

B<T>::fn

public可见,但私有。 替换为using B<T>::fn;,它也将公开。

如果您移除B<T>::fn,则A::fn会被A::fn隐藏, 所以在主要电话中呼叫{{1}}。