无法在类中初始化静态地图

时间:2013-05-30 14:34:30

标签: c++ map static

我正在尝试初始化静态地图 map<string, int>
在我的计划中如下:

testApp.h

class testApp(){
public:
void setup();
void update();
void renew();
static map<string, int> _someMap;
};

testApp.cpp

testApp::setup(){
   _someMap["something"] = 1;
   _someMap["something2"] = 2;
cout<<_someMap["something"]<<"\n";
}

我不想使用boost来短暂使用map并为我的代码添加源依赖项。我不在C++11并且我在程序中没有构造函数,因为类是一个框架类。我在Xcode上并且在.cpp中执行上述操作时,出现以下错误:

Undefined symbols for architecture i386:
  "testApp::mapppp", referenced from:
      testApp::setup() in testApp.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

- &gt;此外,假设我的地图是私有的,我试图在我的课程中这样做:

...
private:
static someVariable;
static void someFunction();

的.cpp

testApp::setup(){
someFunction();
}

错误:

Undefined symbols for architecture i386:
  "testApp::_someMap", referenced from:
      testApp::someFunction() in testApp.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

1 个答案:

答案 0 :(得分:3)

您已在类定义中声明了该变量,但看起来您尚未对其进行定义。每个静态变量只需要在一个转换单元中定义。因此,在源文件中添加一个定义:

map<string, int> testMap::_someMap;

如果您愿意(如果您不能使用C ++ 11初始化程序),则可以避免通过从函数结果初始化地图来调用setup函数:

map<string, int> make_map() {
    map<string, int> map;
    map["something"] = 1;
    map["something2"] = 2;
    return map;
}

map<string, int> testMap::_someMap = make_map();