2014-10-06 57 views
0

虽然联的代码:“未定义” 参照++类成员用C

#include <map> 
using std::map; 
#include <string> 
using std::string; 
class C { 
public: 
    static void dump() { 
     for (const auto& e : data) { 
      string(e.first); 
     } 
    } 
private: 
    static map<string,map<string,string>> data; 
}; 
int main() { 
    C::dump(); 
} 

...我得到这个错误:

/tmp/cc4W2iNa.o: In function `C::dump()': 
test.cpp:(.text._ZN1C4dumpEv[_ZN1C4dumpEv]+0x9): undefined reference to `C::data' 
collect2: error: ld returned 1 exit status 

...从克++(GCC)4.9.1 。 我做错了什么?

+1

我们确实应该为这个问题找到一个不太令人困惑的副本(或者将其打成更通用的形状),但它仍然是被选中的主题之一。 – 2014-10-06 22:07:49

+0

更全面的重复在这里:http://stackoverflow.com/questions/7092765 – 2014-10-06 22:17:53

回答

7

您声明了C::data,但没有定义它。添加一个定义在类的外部:

map<string,map<string,string>> C::data; 

在一个更大的计划,其中超过一个源文件,这必须在短短的一个源文件去满足一个定义规则;而类别定义(包括data的声明)可能会在标题中随时可用。

+0

从你身边的一些笔记关于作为一个愚蠢的关闭,并找到一个更合适的? – 2014-10-06 22:08:57

+0

我必须定义一个非函数类成员? Srsly? – 2014-10-06 22:12:58

+0

@πάνταῥεῖ:这一个,也许? http://stackoverflow.com/questions/7092765 – 2014-10-06 22:13:01