C++ 无法在类中初始化静态映射

C++ 无法在类中初始化静态映射,c++,map,static,C++,Map,Static,我正在尝试初始化的静态映射 map在我的程序中如下所示: testApp.h class testApp(){ public: void setup(); void update(); void renew(); static map<string, int> _someMap; }; -->此外,假设我的地图是私有的,为此我在课堂上尝试过这样做: ... private: static someVariable; static void someFunction(); .cpp

我正在尝试初始化
的静态映射
map

在我的程序中如下所示:

testApp.h

class testApp(){
public:
void setup();
void update();
void renew();
static map<string, int> _someMap;
};
-->此外,假设我的地图是私有的,为此我在课堂上尝试过这样做:

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

testApp::setup(){
   _someMap["something"] = 1;
   _someMap["something2"] = 2;
cout<<_someMap["something"]<<"\n";
}
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)

您已经在类定义中声明了该变量,但看起来您还没有定义它。每个静态变量都需要在一个转换单元中定义。因此,请将定义添加到源文件:

map<string, int> testMap::_someMap;

你曾经定义过这个变量吗?你把这个:map testApp:\u someMap;在您的.cpp文件中?我相信您在
setup
中错误地编写了
map
,而意思是
\u someMap
。还有一个事实是,错误抱怨符号
mappp
,它在您的程序中没有出现。。。如果您需要帮助,请复制粘贴真实代码(对其进行精简),不要编写不同的版本(产生的问题与您的版本不同)。@marcin_j:不。您的意思是没有声明静态变量?您必须将其定义为marcin_j所说的类外函数实现。你的静电必须存在于某个地方,看在上帝的份上,它是一个全球性的!为什么呢?这也是因为某些规则或逻辑决定吗?还有,为什么我不能从构造函数初始化私有静态成员变量?在这种情况下,为什么我需要使用另一个静态函数来初始化我的静态映射?@user1240679:为什么?这是一条规则,称为一个定义规则:如果程序使用它,每个静态变量都必须在一个转换单元中定义。@user1240679:为什么我不能从构造函数初始化私有静态成员变量?因为构造函数初始化类的每个对象。静态成员只有一个实例,不管您创建了多少个类实例;即使您从未创建类对象(因此也从未运行构造函数),它也必须存在。@user1240679:请每个问题问一个问题
map<string, int> testMap::_someMap;
map<string, int> make_map() {
    map<string, int> map;
    map["something"] = 1;
    map["something2"] = 2;
    return map;
}

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