如何访问从模板 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>
是 KeyboardListener
的 private base class(KeyboardListener
是使用 class
,并且在从基础 class) 派生时没有指定 public
关键字。所以从 KeyboardListener
到 EventListener<KeyboardListener>
的转换只能由可以访问 KeyboardListener
的私有成员的人完成,而 EventDispatcher
不能。
我敢猜测 private
继承是偶然的,而不是你想要的。但如果确实需要,您也必须在 KeyboardListener
中声明 EventDispatcher
为好友。
类 的默认继承是私有的。当你有
class KeyboardListener : EventListener<KeyboardListener> {};
您正在从 EventListener
私有继承,所有 EventListener
成员都是私有的。我认为你应该公开继承
class KeyboardListener : public EventListener<KeyboardListener> {};
我正在尝试访问从 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>
是 KeyboardListener
的 private base class(KeyboardListener
是使用 class
,并且在从基础 class) 派生时没有指定 public
关键字。所以从 KeyboardListener
到 EventListener<KeyboardListener>
的转换只能由可以访问 KeyboardListener
的私有成员的人完成,而 EventDispatcher
不能。
我敢猜测 private
继承是偶然的,而不是你想要的。但如果确实需要,您也必须在 KeyboardListener
中声明 EventDispatcher
为好友。
类 的默认继承是私有的。当你有
class KeyboardListener : EventListener<KeyboardListener> {};
您正在从 EventListener
私有继承,所有 EventListener
成员都是私有的。我认为你应该公开继承
class KeyboardListener : public EventListener<KeyboardListener> {};