我正在經歷一些危機,我需要將一個型別定義的模板類添加到好友中,但是我收到了大量錯誤(太多了,無法粘貼在這里)。我把 MRE 放在這里,所以你們不必設定檔案。
為了完整起見,這里是 .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;但我得到了詳細說明 type 指的是 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>;
沒有運氣。
真的很感激任何幫助。
uj5u.com熱心網友回復:
使鍵盤和滑鼠類中的 SomeServerFunc 函式私有,并使 MessageHandler 成為鍵盤和滑鼠的朋友。
我在mouse.h 和keyboard.h 中添加了類宣告,以使編譯器滿意。代碼如下:
#pragma once
namespace wm
{
template < class Keyboard, class Mouse >
class _MessageHandler;
namespace io
{
class Keyboard;
class Mouse
{
friend class _MessageHandler<io::Keyboard, io::Mouse>;
private:
Mouse(const Mouse&) = delete;
void operator=(const Mouse&) = delete;
Mouse() = default;
public:
static Mouse& Instance();
private:
static void SomeServerFunc();
public:
static void SomeClientFunc();
};
}
}
#pragma once
namespace wm
{
template < class Keyboard, class Mouse >
class _MessageHandler;
namespace io
{
class Mouse;
class Keyboard
{
friend class _MessageHandler<io::Keyboard, io::Mouse>;
private:
Keyboard(const Keyboard&) = delete;
void operator=(const Keyboard&) = delete;
Keyboard() = default;
public:
static Keyboard& Instance();
private:
static void SomeServerFunc();
public:
static void SomeClientFunc();
};
}
}
uj5u.com熱心網友回復:
這_MessageHandler不是一個類,而是一個模板。試試看:
namespace wm
{
template<class Keyboard, class Mouse> class MessageHandler;
namespace io
{
class Keyboard
{
template<class Keyboard, class Mouse> friend class wm::MessageHandler;
...
};
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/399074.html
上一篇:博客之星不小心評了一些一星和三星,特此記錄下名單,明天改為五星,有需要五星的評論區留言
下一篇:斜率圖-ggplot2
