0

我有以下代码:

template <typename T> LuaCall& operator>>(T) { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
template <> LuaCall& operator>><int&>(int& val) { mResults.push_back(std::make_pair(LUA_RESULT_INTEGER, (void *)&val)); return *this; }
template <> LuaCall& operator>><float&>(float& val) { mResults.push_back(std::make_pair(LUA_RESULT_FLOAT, (void *)&val)); return *this; }
template <> LuaCall& operator>><double&>(double& val) { mResults.push_back(std::make_pair(LUA_RESULT_DOUBLE, (void *)&val)); return *this; }
template <> LuaCall& operator>><bool&>(bool& val) { mResults.push_back(std::make_pair(LUA_RESULT_BOOLEAN, (void *)&val)); return *this; }
template <> LuaCall& operator>><std::string&>(std::string& val) { mResults.push_back(std::make_pair(LUA_RESULT_STRING, (void *)&val)); return *this; }
template <> LuaCall& operator>><LuaNilStruct>(LuaNilStruct) { mResults.push_back(std::make_pair(LUA_RESULT_NIL, (void *)NULL)); return *this; }

进而:

int abc;
LuaCall(l, "test") % "test" % 5 % LuaNil % 2.333 >> abc;

我希望它像 cin >> 那样工作,即它需要将 lua 函数的返回值写入 abc。所以我需要它的地址..但它默认使用默认模板。我究竟做错了什么?肯定有办法做到这一点,因为 cin 正是这样做的。

谢谢!


请注意将 % 更改为 >> 的人:我将其更改回来,因为它是这样的:D 代码调用 Lua 函数 test("test", 5, nil, 2.333) 并将其返回值保存到 abc。% 用于函数的参数,>> 用于返回值。

template <typename T>
LuaCall& operator%(T val) {
    mLua->Push(val);
    ++mArguments;
    return *this;
}
4

3 回答 3

2

您已将 operator>> 编写为一元运算符,但它是二元运算符。LeftHandSide >> RightHandSide.

因此形式std::cout <"Hello" << " world";(operator<<(operator<<(std::cout, "Hello"), " world); - 第一个<<返回 std::cout 用作第二个的左侧<<

真正的问题是,在您的代码中,查找发生如下:

  1. 候选函数已确定(只有一个候选函数,模板)
  2. 推导出 T。
  3. 确定要实例化的专业化(如果有)。

在步骤 2 中,T==int。在第 3 步中,没有专门化,T==int因此选择并实例化了基本模板。您可能希望使用重载而不是特化。重载将是第 1 步中更好的匹配,因此您甚至没有达到模板参数推导的目的

于 2009-10-27T12:20:39.120 回答
1

您不能"test" , 5 or 2.333在需要引用的地方使用常量值 ( )。当您需要此行为时,将您的模板和参数类型更改operator>>为(等)。int, float

于 2009-10-27T12:21:24.670 回答
0

一方面,operator>>二元运算符。这意味着它必须有两个参数。第一个参数必须是

LuaCall(l, "test") % "test" % 5 % LuaNil % 2.333

由于该运算符返回LuaCall&,我想这就是该调用(以及左参数)的结果。

据此,mResult我假设您尝试将该运算符作为类成员来执行。但我不认为你可以专门化成员模板。

最后,我认为您不应该专门研究引用类型。这

template <> LuaCall& operator>><int>(int val);

应该做

于 2009-10-27T12:20:11.133 回答