错误:左值作为一元'&'操作数

时间:2015-05-23 04:36:09

标签: c++

在我的代码中,我正在调用这样的函数:

Simulator::Schedule (Seconds(seconds),
                     &HelloProtocol::sendScheduledInterest(seconds), this, seconds);

以下是上述功能的签名:

  /**
   * @param time the relative expiration time of the event.
   * @param mem_ptr member method pointer to invoke
   * @param obj the object on which to invoke the member method
   * @param a1 the first argument to pass to the invoked method
   * @returns an id for the scheduled event.
   */
  template <typename MEM, typename OBJ, typename T1>
  static EventId Schedule (Time const &time, MEM mem_ptr, OBJ obj, T1 a1);

函数sendScheduledInterest()的定义是:

void
HelloProtocol::sendScheduledInterest(uint32_t seconds)
{
    //...
}

我收到以下编译错误:

hello-protocol.cpp: In member function ‘void ns3::nlsr::HelloProtocol::scheduleInterest(uint32_t)’:
hello-protocol.cpp:58:60: error: lvalue required as unary ‘&’ operand

如果我在函数调用之前删除&,则会出现以下错误:

hello-protocol.cpp: In member function ‘void ns3::nlsr::HelloProtocol::scheduleInterest(uint32_t)’:
hello-protocol.cpp:58:75: error: invalid use of void expression

2 个答案:

答案 0 :(得分:5)

HelloProtocol::sendScheduledInterestvoid函数。这意味着它返回无值。你既不能在void函数的返回值上调用operator(&amp;)的地址,也不能将它作为参数传递给另一个函数,除非该类型也是void,这只有在涉及某些模板时才会发生。 / p>

看来你实际上打算将函数指针作为参数传递,如下所示:

Simulator::Schedule(
    Seconds(seconds),
    &HelloProtocol::sendScheduledInterest,
    this,
    seconds);

在这两种情况下,编译器都会告诉您具体问题。

在第一种情况下,void表达式左值。您可以将左值视为可以在赋值语句的左侧分配的值。运算符(&amp;)的地址只能应用于左值。

在第二种情况下,您尝试使用不允许的void表达式,即作为其形式参数类型为非void的函数的参数。

答案 1 :(得分:2)

您正在获取sendScheduledInterest的返回值的地址,而不是方法本身的地址。删除(seconds)位。

您似乎打算将seconds值绑定到sendScheduledInterest的调用

使用标准库,可以像这样实现:

Schedule更改为

EventId Schedule(const Time&, std::function<void()>);

然后将其用作

Schedule(Seconds(seconds), bind(&HelloProtocol::sendScheduledInterest, this, seconds));