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

How to access private static class member inherited from a template class?

我正在尝试访问从 EventListener 模板继承的静态变量,但派生的 KeyboardListener class 似乎不是 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; 
        }
};

试试这个:

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

你的问题是 EventListener<KeyboardListener>KeyboardListenerprivate base class(KeyboardListener 是使用 class,并且在从基础 class) 派生时没有指定 public 关键字。所以从 KeyboardListenerEventListener<KeyboardListener> 的转换只能由可以访问 KeyboardListener 的私有成员的人完成,而 EventDispatcher 不能。

我敢猜测 private 继承是偶然的,而不是你想要的。但如果确实需要,您也必须在 KeyboardListener 中声明 EventDispatcher 为好友。

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

class KeyboardListener : EventListener<KeyboardListener> {};

您正在从 EventListener 私有继承,所有 EventListener 成员都是私有的。我认为你应该公开继承

class KeyboardListener : public EventListener<KeyboardListener> {};

Live Example