【问题标题】:"Undefined" reference to class member in C++ [duplicate]C ++中对类成员的“未定义”引用[重复]
【发布时间】:2014-10-06 21:53:31
【问题描述】:

链接此代码时:

#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

...来自 g++ (GCC) 4.9.1。 我做错什么了吗?

【问题讨论】:

  • 我们确实应该为这个问题找到一个不那么令人困惑的重复项(或者将它变成一个更通用的形状),但它仍然是该主题中获得最高票数的问题。
  • 这里有一个更全面的副本:stackoverflow.com/questions/7092765

标签: c++ oop gcc linker


【解决方案1】:

您已声明 C::data,但未定义它。在类外添加定义:

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

在一个较大的程序中,有多个源文件,这必须只放在一个源文件中才能满足单一定义规则;而类定义(包括data 的声明)可能会放在标头中,以便在需要的地方可用。

【讨论】:

  • 您身边关于作为受骗者关闭并找到更合适的人的一些说明?
  • 我必须定义一个非函数类成员? Srsly?!
  • @πάνταῥεῖ:也许是这个? stackoverflow.com/questions/7092765
  • @AlexanderAlexandrowitschKlim:是的,认真的。这就是单一定义规则所要求的。
  • @MikeSeymour 是的,它更加抽象/通用,但缺少投票:P ...
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2021-07-10
相关资源
最近更新 更多