C ++ Deduced模板似乎是空的'在海湾合作委员会下,但不是在MSVC下

时间:2017-07-31 15:45:47

标签: c++ templates gcc visual-c++

编辑:正如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);
  }
};

导致这种行为的原因是什么,或者我一般做错了什么?

0 个答案:

没有答案