【解決方法】静的テンプレート メンバーから名前空間の通常のテンプレートへの変換がうまくいかない


この問題を説明するのは難しいですが、最善を尽くします。
コードをリファクタリングして、静的メンバーのみを持つクラスから特定の名前空間の通常の関数に移行しようとしています。 そのうちの 1 つは、作成しようとしているゲームの Lua スクリプトを処理する「スクリプト」クラスです。 C++ と Lua のバインディングには「Sol」という外部ライブラリを使用します。 Script クラスには、プライベート sol::state があります。 いくつかのスクリプト ファイルを実行するための “RunFile()” など、すべて正常に動作する他のコードと一緒にいくつかのテンプレート関数がありました。

私が得る問題は、関数を Lua に登録するためのテンプレート関数が呼び出されるが、どういうわけか機能しないことです。 私はあなたが使用できる Sol ライブラリを使用しています: m_lua[functionName] = 関数; 関数を Lua に登録します。 このハードコードされた m_lua を入力すると[PushEvent] = PushEvent; それはまだ動作します。

//Script.h
class Script
{

private:
	static sol::state m_lua;

...

template <typename T>
	static void RegisterFunction(std::string functionName, T function); //registers c++ functions to Lua
};

template <typename T>
void Script::RegisterFunction(std::string functionName, T function) //registers c++ functions to Lua
{
	m_lua[functionName] = function;
}

//Script.cpp
#include "Script.h"
sol::state Script::m_lua;

それは私が望むように動作します.Luaに関数を登録することができます:

Script::RegisterFunction("PushEvent", Events::PushEvent);

何らかの理由で、クラスを削除し、すべてをクラスの代わりに名前空間 Script に配置し、m_lua 変数を匿名名前空間に配置すると、機能しなくなりました。

<pre>
//Script.h
namespace Script
{
namespace { //anonymous namespace
	static sol::state m_lua;
}
...

template <typename T>
void RegisterFunction(std::string functionName, T function) //registers c++ functions to Lua
{
	m_lua[functionName] = function;
}

}


//Script.cpp
#include "Script.h"
sol::state Script::m_lua;

私はこれを理解していません。 クラスが大きな違いを生むべきではなく、通常の関数を使用することを考えました。

プログラムは正常にコンパイルおよびリンクされますが、関数が Lua に登録されないため、関数名 (PushEvent など) が見つからないというランタイム エラーが発生します。 それは本当にこの RegisterFunction テンプレートに要約されますが、なぜそれがうまくいかないのか、私には理解できません。
デバッグ中にすべての関数が呼び出されます (m_lua[functionName] = 関数; コード上を歩くと実行されます)。

誰かが答えを知っていれば、それは大歓迎です!

私が試したこと:

正常に動作するクラスに戻ります。

解決策 1

この問題を何時間も解こうとした後、頭がぼんやりしてきて、もうまともに考えることができませんでした。 それは私のあいまいな質問を部分的に説明しています。申し訳ありません。

変数をヘッダーからソースファイルに移動することで解決しましたが、これが原因でした。
定義したテンプレートには、変数にアクセスする Get() 関数を追加しました。

それにもかかわらず、リチャードを助けてくれてありがとう!

コメント

タイトルとURLをコピーしました