在 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