【发布时间】:2021-12-30 22:28:18
【问题描述】:
我正在经历一些危机,我需要为一个类型定义的模板类添加好友,但我遇到了很多错误(太多错误,无法粘贴到这里)。我已经把 MRE here 放在了,所以你们不必设置文件。
为了完整起见,这里是 .h 文件:
//Keyboard.h
#pragma once
namespace wm
{
namespace io
{
class Keyboard
{
//friend wm::MessageHandler;
private:
Keyboard(const Keyboard&) = delete;
void operator=(const Keyboard&) = delete;
Keyboard() = default;
public:
static Keyboard& Instance();
static void SomeServerFunc();
public:
static void SomeClientFunc();
};
}
}
//Mouse.h
#pragma once
namespace wm
{
namespace io
{
class Mouse
{
//friend wm::MessageHandler;
//friend class wm::MessageHandler; ??
private:
Mouse(const Mouse&) = delete;
void operator=(const Mouse&) = delete;
Mouse() = default;
public:
static Mouse& Instance();
static void SomeServerFunc();
public:
static void SomeClientFunc();
};
}
}
//MessageHandler.h
#pragma once
#include "Keyboard.h"
#include "Mouse.h"
namespace wm
{
template < class Keyboard, class Mouse >
class _MessageHandler
{
public:
static _MessageHandler& Instance();
_MessageHandler(const _MessageHandler&) = delete;
void operator=(const _MessageHandler&) = delete;
private:
_MessageHandler() = default;
static void SomeMsgHandelingFunc(); //calls SomeServerFunc from window and mouse
};
typedef _MessageHandler<io::Keyboard, io::Mouse> MessageHandler;
}
事实上,上面的代码编译并运行良好。但我想将键盘和鼠标类中的SomeServerFunc 函数设为私有,并使MessageHandler 成为Keyboard 和Mouse 的朋友。我尝试了不同的方法,但到目前为止没有任何效果。
我在做friend class wm::MessageHandler;,但我得到了详细的类型引用 typedef 错误。
然后我发现在 c++ 11 之后,你可以做 friend wm::MessageHandler; 这会产生很多错误。我也试过了
friend wm::_MessageHandler<io::Keyboard, io::Mouse>;
friend class wm::_MessageHandler<io::Keyboard, io::Mouse>;
friend wm::_MessageHandler<Keyboard, Mouse>;
friend class wm::_MessageHandler<Keyboard, Mouse>;
运气不好。
非常感谢任何帮助。
【问题讨论】:
-
这并没有解决问题,但是以下划线开头的名称后跟大写字母 (
_MessageHandler) 和包含两个连续下划线的名称保留供实现使用。不要在你的代码中使用它们。 -
@PeteBecker 这次有点太晚了,但我会在以后的项目中记住这一点:)
标签: c++ templates typedef friend