[英]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.