1

私は luabind を学んでおり、luabind::object を使用して C++ から Lua の変数にアクセスしようとしています。

「オブジェクト」に int を代入すると、コンパイルが失敗しました。

コード:

int main()
{
    using namespace luabind;
    lua_State *L;
    L = luaL_newstate();
    luaL_openlibs(L);
    open(L);
    luaL_dofile(L, "./test.lua"); // a = 5
    object g = globals(L);
    object num = g["a"];
    num = 6; // Failed to compile
    return 0;
}

エラーメッセージ:

luatets.cpp:21:6: error: no match for ‘operator=’ (operand types are ‘luabind::adl::object’ and ‘int’)
  num = 6;
/usr/include/luabind/object.hpp:731:9: note: luabind::adl::object& luabind::adl::object::operator=(const luabind::adl::object&)
   class object : public object_interface<object>
/usr/include/luabind/object.hpp:731:9: note:   no known conversion for argument 1 from ‘int’ to ‘const luabind::adl::object&’

しかし、2 行を結合した後、コードは機能しました。

g["a"] = 6;

なぜこれが起こったのかわかりません。luabind のドキュメントでは、次のように述べられています。

Lua オブジェクトがある場合は、代入演算子 (=) を使用して新しい値を代入できます。これを行うと、default_policy を使用して C++ 値から Lua への変換が行われます。

また、クラス宣言では、object& だけでなく、任意の型に対して代入演算子がオーバーロードされます。

template <class T>
object& operator=(T const&);

object& operator=(object const&); 

ところで、これに似た問題を見つけました、誰も答えませんでした。

luabind ヘッダーを確認しましたが、これらの恐ろしいプロキシ内に手がかりが見つかりませんでした。

最初のコードが正しくない理由と、オーバーロードされているかどうかを誰か教えてもらえますかoperator=(T const &)?

どうもありがとう!!

4

1 に答える 1

0

Luabind 0.9.1 には、(おそらく古い?!) ドキュメントの内容に関係なく、オブジェクトにそのような operator= オーバーロードはありません。実際、object には operator= オーバーロードがまったくありません (また、オブジェクトの派生元である object_interface もありません)。

ただし、次の機能があります。

template<class T>
    index_proxy<object> operator[](T const& key) const

g["a"] = 6;index_proxy には次の機能があるため、これが機能する理由です。

template<class T>
    this_type& operator=(T const& value)

これは int 用にインスタンス化できます。

于 2014-09-19T01:34:18.590 に答える