2012-09-07 62 views
-1

所以我有靜態成員我的頭文件:C++類的靜態成員

#ifndef PROFILE_MANAGER_H 
#define PROFILE_MANAGER_H 

#include <map> 
#include <vector> 

using namespace std; 
using std::vector; 

namespace Engine 
{ 
    class ProfileManager 
    { 
    private: 
     static map<const char*, vector<float>> profiles; 
     static map<const char*, vector<float>>::iterator it; 
     static pair<map<const char*, vector<float>>::iterator, bool> ret; 
    }; 
} 

#endif 

而且在我的cpp文件我有定義:

#include "ProfileManager.h" 

namespace Engine 
{ 
    map<const char*, vector<float>> ProfileManager::profiles; 
    map<const char*, vector<float>>::iterator ProfileManager::it; 
    pair<map<const char*, vector<float>>::iterator, bool> ProfileManager::ret; 
} 

鏈接器總是抱怨的靜態成員是即使我已經在cpp文件中定義了它們,也是無法解析的外部(LNK2001)。任何想法爲什麼?

+3

我更驚訝*編譯器*不會抱怨丟失的分號! –

+1

更不用說重複使用右移運算符。 – WhozCraig

+1

你確定你正在編譯cpp文件? –

回答

2

這些類型的錯誤通常發生在鏈接器未被賦予cpp編譯結果的obj文件時。

在您的輸出目錄中查找ProfileManager.obj。如果它不存在,那就錯了。可能cpp文件不是按照Luchian Grigore的建議編譯的。也有可能連接器沒有被賦予參數中的obj文件。如果您使用visual studio,請檢查cpp文件是否爲項目的一部分。在其他環境中,請參閱鏈接器被調用的命令。

如果使用Visual Studio,則可以打開項目屬性 - >鏈接器 - >命令行,並在Additional Option中添加/ VERBOSE。然後打開輸出窗口並重新編譯項目。 (謝謝克雷格的評論)。

可能發生的另一種情況。您將頭文件包含在另一個項目中,並且您試圖在不引用ProfileManager.cpp所在的項目的情況下進行構建。

+1

如果你真的想知道什麼是搜索這些符號,你也可以爲你使用的任何工具集提升鏈接器輸出,在VC++中,它在鏈接器輸出設置配置上非常簡單。只要你有這樣的問題,你可以/應該總是把這個問題轉化爲了解被搜索的內容以解決被追蹤的ID。 – WhozCraig