2013-05-30 161 views
0

我想存儲一個boost :: function作爲一個靜態變量,其中的「引用?」從一個函數中獲取。boost :: function靜態成員變量

變量是這樣的:

static boost::function<void(const wchar_t*, const bool)> s_logMessage; 

當我嘗試編譯我的錯誤:

error LNK2001: unresolved external symbol "public: static class boost::function Gorbatras_Converter::ConverterApp::s_logMessage" ([email protected]@[email protected]@[email protected][email protected]@[email protected]@A)

我注意到,如果我不使用變量我可以編譯它沒有這個錯誤(猜測這是一個編譯器優化,因爲它沒有使用),但只要我嘗試使用s_logMessage變量,我得到鏈接錯誤。

我的設置s_logMessage的方式是這樣的:

const int ConverterApp::RunConverter(boost::function<void(const wchar_t* a_message, const bool a_newLine)> a_logMessage) 
{ 
    ConverterApp::s_logMessage = a_logMessage;  
    ... 
} 

我試着將它設置爲一個非靜態成員變量,然後它似乎工作。但我需要它作爲靜態的,否則我可能會把它作爲一個參數發送給我,因爲它將會是很多功能。

如果你想知道爲什麼我發送一個日誌功能作爲參數,那是因爲它來自一個單獨的程序。

所以我需要幫助的是如何將boost :: function函數保存在靜態變量中?

+1

小提示:請注意,在兩種情況下都可以*編譯*而不會出錯。它是*鏈接器*發佈錯誤(適當時)。 – Angew

+0

您需要在名稱空間範圍內定義:'boost :: function ConverterApp :: s_logMessage;' –

+0

我不同意這個重複。相關問題要求的不僅僅是解決這個問題所需要解決的問題。首先必須通過文本頁面閱讀的人不會滿足於stackoverflow,並會嘗試查看下一個google結果。投票重新開放... –

回答

5

您缺少的靜態數據成員一個定義(你只有該成員的類定義中聲明)。將下面的命名空間範圍:

boost::function<void(const wchar_t*, const bool)> ConverterApp::s_logMessage; 

如果你從來不使用數據成員(從技術上講,如果不是ODR使用的,見款C++ 11標準的3.2),那麼該定義不需要 - 因此你正在觀察的行爲。

+0

我們是否會在每個靜態數據成員問題上以相同的方式編寫此答案,或者將_close作爲duplicate_函數使用? –

+3

@LightnessRacesinOrbit:編寫它比花時間去尋找一個重複的東西要少,而且OP需要更少的時間來理解這個答案,而不是找出他們的問題如何與鏈接問題相關。每次OP缺少分號時,我們是否需要查找重複項? –

+2

當OP缺少分號時,我們將以_too localised_關閉。 SO不是衆包的代碼調試機器。而且OP應該習慣花費超過20秒的時間解決他的問題 - 如果實際上需要讀取一個現有的Stack Overflow答案,那麼這個培訓就是一步!你在鼓勵幫助吸血鬼。 –