如何访问从模板类继承的私有静态类成员?

时间:2015-10-28 13:43:55

标签: c++ class templates friend

我正在尝试访问从EventListener模板继承的静态变量,但看起来派生的KeyboardListener类不是EventDispatcher的朋友。我做错了什么?

template <class T>
class EventListener
{
public:
    friend class EventDispatcher;
private:
    static int variable;
};

template <class T> int EventListener<T>::variable;

class KeyboardListener : EventListener<KeyboardListener> {};

class EventDispatcher {
    public:
        static void foo() {
            // this works
            std::cout << &EventListener<KeyboardListener>::variable << std::endl;
            // fails to compile with: 
            // 'int EventListener<KeyboardListener>::variable' is private
            std::cout << &KeyboardListener::variable << std::endl; 
        }
};

3 个答案:

答案 0 :(得分:3)

您的问题是,EventListener<KeyboardListener>私有基类KeyboardListenerKeyboardListener使用class进行了十分转换,而您没有&#39 ; t从派生类派生时指定public关键字。因此,KeyboardListenerEventListener<KeyboardListener>的转换只能由可以访问KeyboardListener的{​​{1}}私人成员的人完成。

我猜测EventDispatcher遗传是偶然的而不是你想要的。但如果确实需要,您还必须在private中声明EventDispatcher为朋友。

答案 1 :(得分:1)

类的默认继承是私有的。当你有

class KeyboardListener : EventListener<KeyboardListener> {};

您从EventListener私下继承所有EventListener成员都是私有的。我认为你会像

一样公开继承
class KeyboardListener : public EventListener<KeyboardListener> {};

Live Example

答案 2 :(得分:0)

试试这个:

class KeyboardListener : EventListener<KeyboardListener> {
    friend class EventDispatcher;
};