在 C++ 中使用 ibpp 时从和到 void * 的无效转换
Invalid conversion from and to void * when using ibpp in c++
我的一位 class 成员有 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);
在评论中您说:
well, guys, please, pay attention to the fact that IBPP::Database
is a typedef of IBPP::IDatabase *
不,不是。
再看:
error: invalid static_cast from type IBPP::Database
{aka IBPP::Ptr<IBPP::IDatabase>}
它是 Ptr<IDatabase>
的类型定义,而不是 IDatabase*
,所以它是一个智能指针,不能转换为 void*
见http://www.ibpp.org/reference/guidelines#ibpp_smart_pointers_reference
我的一位 class 成员有 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);
在评论中您说:
well, guys, please, pay attention to the fact that
IBPP::Database
is a typedef ofIBPP::IDatabase *
不,不是。
再看:
error: invalid static_cast from type IBPP::Database
{aka IBPP::Ptr<IBPP::IDatabase>}
它是 Ptr<IDatabase>
的类型定义,而不是 IDatabase*
,所以它是一个智能指针,不能转换为 void*
见http://www.ibpp.org/reference/guidelines#ibpp_smart_pointers_reference