在c ++中使用ibpp时无效转换为void *

时间:2015-08-04 15:17:19

标签: c++ casting firebird

我的一个班级成员有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);

1 个答案:

答案 0 :(得分:2)

在评论中你说:

  

好吧,伙计们,请注意IBPP::DatabaseIBPP::IDatabase *

的typedef这一事实

不,不是。

再看一遍:

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