使用 LuaBridge 模板函数内的"addConstructor"出现奇怪的编译器错误

编辑:我使用的是带有 GCC 的 XCode 12.5.1。此问题可能仅限于 GCC,因为 MSC 可以编译而没有错误。啊!

我正在尝试设置通用的模板函数来将类添加到 LuaBridge 中。我在“.addConstructor”上遇到了一个奇怪的错误。最终,我考虑使用“refl-cpp”来获取类型名称和函数信息,但目前我正在努力解决与“refl-cpp”无关的问题。

这是我的模板函数:

struct foo {int bar();};

template<class T, typename ConstructorArgs>
void addclass(lua_State *l)
{
   luabridge::getGlobalNamespace(l)
      .beginNamespace ("bar")
         .beginClass<T>("foo")
            .addConstructor<ConstructorArgs>() // 错误:使用 'template' 关键字将 'addConstructor' 视为相关模板名称
            .addFunction("bar", &foo::bar)
         .endClass()
      .endNamespace();
}

static void my_program()
{
   lua_State *l;
   l = luaL_newstate();
   luaL_openlibs(l);
   addclass<foo,void (*) (void)>(l);
}

请注意,.addFunction 调用没有问题。如果我注释掉.addConstructor,程序将编译并正确运行。奇怪的是,如果我忽略 T 模板类并在调用 beginClass 时将 foo 硬编码,它就可以工作:

template<class T, typename ConstructorArgs>
void addclass(lua_State *l)
{
   luabridge::getGlobalNamespace(l)
      .beginNamespace ("bar")
         .beginClass<foo>("foo") // 在此处硬编码 <foo> 可以消除错误并使程序正常工作
            .addConstructor<ConstructorArgs>()
            .addFunction("bar", &foo::bar)
         .endClass()
      .endNamespace();
}

我无法确定问题出在 addConstructor 还是 beginClass

编辑:请查看下面链接的文章。基于此,简短的答案是将 addConstructor 的调用更改如下所示:

.template addConstructor<ConstructorArgs>()

在 MSC 和 GCC 上都可以运行。

原文链接 https://stackoverflow.com/questions/69412643

点赞