2015-01-16 32 views
2

**我也跟着:http://www.qt-coding.com/2013/08/06/tip-of-the-day-redirect-qdebug-to-a-file/qInstallMessageHandler指向外部的lib方法

我創建了一個方法:

MyLogging(QtMsgType type, const QMessageLogContext &context, const QString &msg); 

,它位於一個外部LIB(我創建)爲我的主要項目。

當我做到以下幾點:

qInstallMessageHandler(MyLib::MyLogging); 

編譯器說,它無法在轉換:

error: C2664: 'QtMessageHandler qInstallMessageHandler(QtMessageHandler)' : cannot convert argument 1 from 'void (__cdecl MyLib::*)(QtMsgType,const QMessageLogContext &,const QString &)' to 'QtMessageHandler沒有上下文中,這種轉換是可能的」

但是,如果我移動我的MyLogging方法與main.cpp內聯,一切正常。

我在跟蹤爲什麼會出現這種情況。任何幫助理解這一點都會很棒。

回答

1

成員函數(方法)與常規函數大不相同。他們需要知道他們需要哪個對象(this指針)。所以要修復它使MyLogging成爲全局函數或靜態成員函數。

注:也有在C++11mem_fn可以解決上述問題,但qInstallMessageHandler需要一個函數指針,當mem_fn創建包裝對象。也許這會改變後來的Qt版本。

+0

啊,好的。 C++缺少一些在C#/ Java中更容易的事情。謝謝@ nazar554 – Arnej65