2015-07-21 100 views
0

爲什麼編譯器抱怨鑄造這裏轉換要求reinterpret_cast,C樣式轉換或函數樣式轉換

class DBconnection { 
    public: 
    DataSet* query(string qStr) { 
    ConnImpl* conImpl = ConnectionPool::getInstance()->acquireConnection(); 
    DataSet *data = new DataSet(); 
    conImpl->doQuery(qStr,data); 
    ConnectionPool::getInstance()->releaseConnection(conImpl); 
    return data; 
} 
}; 


class Client { 
    public: 
    DataSet* queryDB(string q) { 
    return new DBconnection()->query(q); 
    } 
}; 

客戶:: queryDB(STD :::字符串)實際上是通過返回一個DataSet指針的DbConnection ::查詢(的std :: string)。

錯誤:

錯誤C2440: '迴歸':無法從 '的DbConnection *' 轉換爲 '數據集*' 指向的類型無關;轉換要求reinterpret_cast,C樣式轉換或函數樣式轉換

如果我嘗試例如 - C-鑄造,它不工作,要麼

return new (DataSet*)DBconnection()->query(q); 
+0

你的代碼應該工作。這是你的真實代碼嗎?在最後一行中,演員的位置是錯誤的。它必須在'new'之前,否則,這是placement-new語法。但是,不應該有必要施放。如果函數返回一個'DataSet *',那麼你不必將它轉換爲'DataSet *'。 (注意:你的代碼泄漏了它創建的所有對象) – gexicide

+0

@gexicide - 是自從我的計算機科學教授做到這一點後,它才能工作:-)。所以我不明白爲什麼編譯器會抱怨或者他爲什麼錯了?關於最後一行 - 這是我試過的:-) – java

+0

順便說一句,我不知道你編寫的環境,但是在大多數C++環境中用你當前的代碼調用'Client :: queryDB'造成泄漏。你可以通過簡單地刪除'new'關鍵字來解決你的問題中的泄漏和問題。 – KABoissonneault

回答

4

您忘記了運算符優先級表:

return (new DBconnection())->query(q);

將工作。 new的優先級低於->

+0

謝謝 - 只是aonther括號:-O他們錯過了。 – java