2015-06-11 44 views
0

我嘗試寫一些命名空間的靜態方法和變量,以便有一組功能我可以從任何地方在代碼中使用。這是我有: 標題:故障使用命名空間和靜態方法

namespace CProfileIO 
{ 
    static void setAppDir(std::string appDir); 
    static int reloadProfiles(); 

    static std::string directory; 
    static std::list<std::string> profilesList; 
} 

來源:

namespace CProfileIO 
{ 

void setAppDir(std::string appDir) 
{ 
    directory = appDir; 
} 

int reloadProfiles() 
{ 
    // ... 
} 

} // namespace CProfileIO 

然後在代碼的某個地方,我有:

#include "CProfileIO.h" 

int main(int argc, char * argv[]) 
{ 
    string appDir = string(dirname(*argv)); 
    CProfileIO::setAppDir(appDir); 
    . 
    . 
    . 
} 

當我嘗試編譯,我得到的錯誤行我使用的功能:

... undefined reference to `CProfileIO::setAppDir(std::string)' 

我無法弄清楚什麼是錯的。我會幫助所有人!

+0

可能的[靜態變量在C++]重複(http://stackoverflow.com/questions/3698043/static-variables-in- C)。 – DevSolar

+3

C++不是C#,'這裏static'裝置的功能,只在當前轉換單元是可見的。只需刪除關鍵字。 –

+0

你真的認爲它與命名空間有關嗎? – juanchopanza

回答

3

你不應該在這裏使用靜態的功能,因爲它們只在當前轉換單元是可見的。因此,您聲明瞭一個靜態函數,您可以在cpp中定義(靜態),然後它將不會從其他翻譯單元可見。

您應該在此處不要使用static關鍵字,而是將變量(但不是函數)聲明爲extern

另外,我建議通過字符串參數爲const參考(void setAppDir(const std::string& appDir);

+0

Okaay所以我undrestand,在C++中的靜態是C相同。但是現在我真的很困惑我該如何在名稱空間中聲明函數和變量來訪問它們。 – Bremen

+0

你可以像這樣訪問一個名字空間的函數:'CProfileIO :: setAppDir(「something」);' – petersohn

+0

我知道,但我不知道如何以「正確」的方式構造名字空間文件。現在我已經將.cpp文件中的函數定義移動到了.h文件中,就像我在標準c中做的那樣,它可以工作,但它看起來不錯。 – Bremen

1

這是因爲靜態方法是僅在當前模塊中可見,(源文件)。他們沒有聯繫。 因此你其他sourcefile沒有找到該函數。如果你使用靜態,這應該會發生。我不知道爲什麼你會將裸露的函數聲明爲靜態的,也許你打算把它們放到一個類中?

+0

我有一個類,而不是一開始的名稱空間,但後來我讀到,我應該有命名空間。我試圖按照這種解決方案http://stackoverflow.com/a/112451/1036082 – Bremen