编辑:正如cpplearner所指出的,我不得不添加&#39;模板&#39;在T ::之前的Key之后。例如:T::template Key<i>::to_string
我正在编写一个展开模板来创建一个编译时循环&#39; for循环&#39;为循环的每次迭代执行指定的回调。
至于背景;我正在编写一个键码帮助器结构,我可以在其中简单地定义一个枚举(C ++双面)变量及其字符串&#39; name&#39;一个宏的价值。这用于为稍后在应用程序中使用的每个键轻松设置to_string方法。 (使用每个对象键的枚举值构建一个JavaScript面的&#39;枚举&#39;对象)
然而问题是我的代码在MSVC下编译,但不在GCC下编译。
我简化了代码以表示问题here
#include <string>
struct KeyCodes
{
enum KeyCode { Key1, Key2 };
typedef void (*LoopCallback)(KeyCode keyCode, std::string str);
template <KeyCode> struct Key
{
std::string to_string(){ return "undefined"; }
static const bool is_valid = false;
};
};
template<> struct KeyCodes::Key<KeyCodes::KeyCode::Key1>
{
std::string to_string() { return "Key1"; };
static const bool is_valid = true;
};
template<> struct KeyCodes::Key<KeyCodes::KeyCode::Key2>
{
std::string to_string() { return "Key2"; };
static const bool is_valid = true;
};
template <typename T, KeyCodes::KeyCode i, bool is_valid, KeyCodes::KeyCode max>
struct KeyCodeLoop {};
template <typename T, KeyCodes::KeyCode i, KeyCodes::KeyCode max>
struct KeyCodeLoop<T, i, true, max>
{
static void loop(KeyCodes::LoopCallback to_call)
{
to_call(i, T::Key<i>::to_string());
const KeyCodes::KeyCode next = i + 1;
KeyCodeLoop<T, next, T::Key<next>::is_valid, max>::loop(to_call);
}
};
如果我将T替换为实际的&#34; KeyCodes&#34;结构,它确实编译。 Like so
#include <string>
struct KeyCodes
{
enum KeyCode { Key1, Key2 };
typedef void (*LoopCallback)(KeyCode keyCode, std::string str);
template <KeyCode> struct Key
{
std::string to_string(){ return "undefined"; }
static const bool is_valid = false;
};
};
template<> struct KeyCodes::Key<KeyCodes::KeyCode::Key1>
{
std::string to_string() { return "Key1"; };
static const bool is_valid = true;
};
template<> struct KeyCodes::Key<KeyCodes::KeyCode::Key2>
{
std::string to_string() { return "Key2"; };
static const bool is_valid = true;
};
template <typename T, KeyCodes::KeyCode i, bool is_valid, KeyCodes::KeyCode max>
struct KeyCodeLoop {};
template <typename T, KeyCodes::KeyCode i, KeyCodes::KeyCode max>
struct KeyCodeLoop<T, i, true, max>
{
static void loop(KeyCodes::LoopCallback to_call)
{
to_call(i, KeyCodes::Key<i>::to_string());
const KeyCodes::KeyCode next = i + 1;
KeyCodeLoop<T, next, KeyCodes::Key<next>::is_valid, max>::loop(to_call);
}
};
导致这种行为的原因是什么,或者我一般做错了什么?