繁体   English   中英

错误:C ++中一元`&'中的非左值

[英]error: non-lvalue in unary `&' in C++

我们正在使用宏包装器来绑定参数位置函数。

#define bindWhereClause(fieldName, fieldDataType, fieldData) _bindWhereClause(fieldName, fieldDataType, sizeof(fieldData), &fieldData)

void _bindWhereClause(const char *name, int dataType, int dataSize, void *data)
{
  // Implementation
}

Database.bindWhereClause( "FIRST_NAME", SQL_VARCHAR, name.getFirstName());

当我尝试使用函数作为参数调用宏时(如上所述),我收到错误消息“错误:一元`&'中的非左值”。

我可以使用普通变量调用宏

Database.bindWhereClause( "FIRST_NAME", SQL_VARCHAR, firstName);

如何解决呢? 我是否需要使用内联函数而不是宏?

提前感谢您的帮助。

谢谢,Mathew Liju

您不能使用函数返回值的地址-它是短暂的。

您需要使用一个实变量:

Nametype first_name = name.getFirstName();
Database.bindWhereClause( "FIRST_NAME", SQL_VARCHAR, first_name);

// ... and maybe name.setFirstName(first_name); here

使用内联函数将使它编译,但它不太可能实际工作 大概是这样的:

Database.execute();

...期望您之前传递地址的对象仍然有效。 如果使用内联函数而不是宏,则这些对象将不再存在,因为它们只是已存在的内联函数的本地对象。

对于这种情况,使用内联函数就可以了。 通常,它要好得多,除非绝对需要使用宏,否则应使用内联函数。

宏扩展为:

_bindWhereClause("FIRST_NAME", SQL_VARCHAR, sizeof(name.getFirstName()), &name.getFirstName())

您不能使用函数返回值的地址,因此无效。 您可以获取变量或参数的地址,因此可以,将其转换为具有实际参数的函数即可。

为什么不围绕数据库编写包装器类。

查看装饰器模式: http : //en.wikipedia.org/wiki/Decorator_pattern

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM