3

我遇到了一个奇怪的问题。考虑这个例子:

class Foo
{
  static const int Bar = 5;

public:
  Foo()
  {
    _map[Bar] = "some characters";
  }

  ~Foo() {}

private:
  std::map<int, std::string> _map;
};

int main()
{
  Foo a;

  return (0);
}

我收到此错误(使用 g++ 4.7.2 编译):

/tmp/ccLy806T.o: In function `Foo::Foo()':
Main.cpp:(.text._ZN3FooC2Ev[_ZN3FooC5Ev]+0x1e): undefined reference to `Foo::Bar'

现在,如果我在 Bar 上做一个 static_cast,它可以工作:

Foo()
{
  int i = Bar; //works
  _map[static_cast<int>(Bar)] = "some characters"; //works
}

Bar仅在构造函数中用作地图下标时才会出现此错误。在 Foo 类中写入_map[Bar] = "some characters";其他函数不会产生任何错误。

这对我来说真的很奇怪,但我希望这里有人能给出答案。

那么,我做错了什么?

4

2 回答 2

4

那是因为map::operator[]将其密钥作为int const&. 它想要你传递给它的东西的地址。当你这样做时:

_map[static_cast<int>(Bar)]

您正在创建一个临时地址,并将地址传递给该临时地址,这很好。但是当你这样做时:

_map[Bar]

Bar实际上没有内存存储。您需要通过以下方式提供:

class Foo {
    ....
};

const int Foo::Bar;
于 2013-11-01T20:20:39.437 回答
0

您需要在顶层添加以下内容以分配存储空间Foo::Bar

const int Foo::Bar;
于 2013-11-01T20:20:46.843 回答