我正在尝试访问从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;
}
};
答案 0 :(得分:3)
您的问题是,EventListener<KeyboardListener>
是私有基类KeyboardListener
(KeyboardListener
使用class
进行了十分转换,而您没有&#39 ; t从派生类派生时指定public
关键字。因此,KeyboardListener
到EventListener<KeyboardListener>
的转换只能由可以访问KeyboardListener
的{{1}}私人成员的人完成。
我猜测EventDispatcher
遗传是偶然的而不是你想要的。但如果确实需要,您还必须在private
中声明EventDispatcher
为朋友。
答案 1 :(得分:1)
类的默认继承是私有的。当你有
class KeyboardListener : EventListener<KeyboardListener> {};
您从EventListener
私下继承所有EventListener
成员都是私有的。我认为你会像
class KeyboardListener : public EventListener<KeyboardListener> {};
答案 2 :(得分:0)
试试这个:
class KeyboardListener : EventListener<KeyboardListener> {
friend class EventDispatcher;
};