C++ 通过Luabind向Lua公开STL队列

C++ 通过Luabind向Lua公开STL队列,c++,stl,lua,queue,luabind,C++,Stl,Lua,Queue,Luabind,我试图用STL队列类替换用Lua编写的队列类的现有实现。我不知道为什么会失败,也不知道如何解决它。下面是一些显示相同行为的示例代码,以及错误输出。提前谢谢 #包括 #包括 结构XYZ_T { 短x,y,z; }; typedef std::queue XYZ_queue_T; 外部“C”int init(lua_State*L) { 使用名称空间luabind; 开放式(L); 模块(L) [ 类别(“XYZ_T”) .def(构造函数()) .def_readwrite(“x”、&XYZ_T:

我试图用STL队列类替换用Lua编写的队列类的现有实现。我不知道为什么会失败,也不知道如何解决它。下面是一些显示相同行为的示例代码,以及错误输出。提前谢谢

#包括 #包括 结构XYZ_T { 短x,y,z; }; typedef std::queue XYZ_queue_T; 外部“C”int init(lua_State*L) { 使用名称空间luabind; 开放式(L); 模块(L) [ 类别(“XYZ_T”) .def(构造函数()) .def_readwrite(“x”、&XYZ_T::x) .def_readwrite(“y”、&XYZ_T::y) .def_readwrite(“z”、&XYZ_T::z), 类别(“XYZ队列”) .def(构造函数()) .def(“推送”、&XYZ_队列_T::推送) .def(“pop”、&XYZ_队列_T::pop) .def(“前端”,&XYZ_队列::前端) .def(“后退”,&XYZ_队列::后退) .def(“空”,&XYZ_队列::空) .def(“大小”,&XYZ_队列::大小) ]; }
以及gcc输出:

g++ -o test_luabind.os -c -fPIC -Iinclude -I$VALID_INCLUDE_DIR /packages/build_env/include test_luabind.cpp test_luabind.cpp: In function `int init(lua_State*)': test_luabind.cpp:27: error: no matching function for call to ` luabind::class_<XYZ_QUEUE_T, luabind::detail::unspecified, luabind::detail::unspecified, luabind::detail::unspecified>::def(const char[6], <unknown type>)' test_luabind.cpp:32: error: parse error before `(' token g++-o test_luabind.os-c-fPIC-Iinclude-I$VALID_INCLUDE_DIR/packages/build_env/INCLUDE test_luabind.cpp test_luabind.cpp:在函数“int init(lua_State*)”中: test_luabind.cpp:27:错误:没有用于调用的匹配函数` luabind::class_u2;::def(常量 char[6],)' test_luabind.cpp:32:错误:在“(”标记之前分析错误 这:

应该是:

class_<XYZ_QUEUE_T>("XYZ_QUEUE_T")
类(“XYZ队列”)

字符串是Lua看到的类型名,模板参数是您使用的C++类型。

哦,如果不公开队列存储的对象,那么将队列公开给Lua也没有什么好处。

这是:

应该是:

class_<XYZ_QUEUE_T>("XYZ_QUEUE_T")
类(“XYZ队列”)

字符串是Lua看到的类型名,模板参数是您使用的C++类型。


哦,如果您不公开队列存储的对象,那么将队列公开给Lua也没有什么好处。

很可能,您的队列实现中有一个重载函数。因此,当您获取地址时,编译器不知道该做什么,因为您可能指的是任何重载函数。

最可能的情况是,您有一个重载函数aded函数在队列实现中。因此,当您获取地址时,编译器不知道该做什么,因为您可能指的是任何重载函数。

正如DeadMG指出的,在重载函数的情况下,您必须告诉编译器选择哪个版本,例如对于
const
版本:

typedef const XYZ_QUEUE_T::value_type& (XYZ_QUEUE_T::*ConstRefConstType)() const;

class_<XYZ_QUEUE_T>("XYZ_QUEUE_T")
    // ...
    .def("front", (ConstRefConstType)&XYZ_QUEUE_T::front)
    .def("back" , (ConstRefConstType)&XYZ_QUEUE_T::back)
    // ...
typedef const XYZ_QUEUE_T::value_type&(XYZ_QUEUE_T::*ConstRefConstType)const;
类别(“XYZ队列”)
// ...
.def(“前端”,(ConstRefConstType)&XYZ_队列::前端)
.def(“后退”,(ConstRefConstType)&XYZ_队列::后退)
// ...

luabind文档包括。

正如DeadMG指出的那样,在函数重载的情况下,您必须告诉编译器选择哪个版本,例如对于
常量
版本:

typedef const XYZ_QUEUE_T::value_type& (XYZ_QUEUE_T::*ConstRefConstType)() const;

class_<XYZ_QUEUE_T>("XYZ_QUEUE_T")
    // ...
    .def("front", (ConstRefConstType)&XYZ_QUEUE_T::front)
    .def("back" , (ConstRefConstType)&XYZ_QUEUE_T::back)
    // ...
typedef const XYZ_QUEUE_T::value_type&(XYZ_QUEUE_T::*ConstRefConstType)const;
类别(“XYZ队列”)
// ...
.def(“前端”,(ConstRefConstType)&XYZ_队列::前端)
.def(“后退”,(ConstRefConstType)&XYZ_队列::后退)
// ...

luabind文档包括。

Gah,我在那里有它,但我忘了用HTML编码符号。而且,定义XYZ__T似乎不会影响问题。长话短说,同样的问题:-(Gah,我在那里有它,但我忘了用HTML编码符号。另外,定义XYZ_______似乎不会影响问题。长话短说,同样的问题:-(如果这是真的,那就是
std::queue::front
,它有一个
const
和非const版本。
back
有类似的版本。太好了!就是这样。现在看起来很明显:-)如果这是真的,那就是
std::queue::front
,它有一个
const
和非const版本。
back
有类似的版本。太好了!就是这样。现在看起来很明显:-)