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 に答える