我的一个班级成员有void *
类型:
void * conn;
在Connection
方法中,我设置了与Firebird
数据库的连接,并将conn
成员设置为:
IBPP::Database conn = IBPP::DatabaseFactory(host, dbname, user, pass);
conn->Connect();
this->conn = static_cast<void *>(conn);
这种处理方式适用于其他多个数据库,但在我尝试将其与Firebird
一起使用时会中断。所以,这就是发生的事情。在另一种方法中,我使用conn
成员从特定数据库中获取数据。谈到Firebird
,我这样做:
IBPP::Transaction tr = IBPP::TransactionFactory(static_cast<IBPP::Database>(this->conn));
但是,这行代码会导致错误消息:
error: invalid conversion from 'void *' to 'IBPP::IDatabase *'
我不知道我做错了什么。
修改
以下是ibpp.h
的一些代码段:
...
class IDatabase;
typedef Ptr<IDatabase> Database;
...
class IDatabase{
public:
virtual const char * ServerName() const = 0;
virtual const char * DatabaseName() const = 0;
...
virtual void Connect() = 0;
...
}
修改
这是一个可重现的测试用例:
#define IBPP_LINUX
#include <ibpp.h>
int main(){
//#1. No errors
IBPP::Database conn = IBPP::DatabaseFactory("localhost","/var/lib/firebird/2.5/data/reestr.fdb","SYSDBA","root");
conn->Connect();
conn->Disconnect();
//end of #1.
//#2. Here we get errors.
void * cn;
IBPP::Database conn2 = IBPP::DatabaseFactory("localhost","/var/lib/firebird/2.5/data/reestr.fdb","SYSDBA","root");
conn2->Connect();
cn = static_cast<void *>(conn2);
conn2->Disconnect();
return 0;
}
这是我尝试编译时得到的错误消息:
error: invalid static_cast from type IBPP::Database
{aka IBPP::Ptr<IBPP::IDatabase>} to type void *
错误消息指向此行代码:
cn = static_cast<void *>(conn2);
答案 0 :(得分:2)
在评论中你说:
好吧,伙计们,请注意
的typedef这一事实IBPP::Database
是IBPP::IDatabase *
不,不是。
再看一遍:
error: invalid static_cast from type IBPP::Database
{aka IBPP::Ptr<IBPP::IDatabase>}
这是 Ptr<IDatabase>
的typedef,而不是IDatabase*
,因此它是智能指针,不能转换为void*
请参阅http://www.ibpp.org/reference/guidelines#ibpp_smart_pointers_reference