我遇到了一个奇怪的问题。 考虑这个例子:
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";
不会产生任何错误。
这对我来说真的很奇怪,但我希望有人在这里有答案。
那么,我做错了什么?
答案 0 :(得分:4)
这是因为map::operator[]
将其密钥作为int const&
。它想要你传递给它的东西的地址。当你这样做时:
_map[static_cast<int>(Bar)]
你正在创建一个临时的,并将地址传递给那个临时的,这很好。但是当你在做的时候:
_map[Bar]
Bar
实际上没有内存存储空间。您需要通过以下方式提供:
class Foo {
....
};
const int Foo::Bar;
答案 1 :(得分:0)
您需要在顶层添加以下内容,以便为Foo::Bar
分配存储空间:
const int Foo::Bar;