编辑:我将 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
模板类和硬编码,它会起作用:foo
beginClass
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。