0

编辑:我将 XCode 12.5.1 与 GCC 一起使用。此问题可能仅限于 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>() // error: Use 'template' keyword to treat 'addConstructor' as a dependent template name
            .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模板类和硬编码,它会起作用:foobeginClass

template<class T, typename ConstructorArgs>
void addclass(lua_State *l)
{
   luabridge::getGlobalNamespace(l)
      .beginNamespace ("bar")
         .beginClass<foo>("foo") // hardcoding <foo> here eliminates error and program works
            .addConstructor<ConstructorArgs>()
            .addFunction("bar", &foo::bar)
         .endClass()
      .endNamespace();
}

我真的无法判断问题出在addConstructor或中beginClass

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

.template addConstructor<ConstructorArgs>()

这适用于 MSC 和 GCC。

4

0 回答 0