我正在尝试初始化静态地图
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)
答案 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();