Being quite green with C++, I ran into behavior I don't quite understand, and haven't been able to find an explanation even with intense googling, so I was hoping someone could explain what exactly is wrong here.
// test.h
#include <unordered_map>
typedef std::unordered_map<int, int> test_type;
class test
{
public:
static const test_type tmap;
};
// test.cpp
#include "test.h"
const test_type test::tmap = {
{ 1, 1 }
};
// main.cpp
#include "test.h"
int main()
{
// Attempt 1: access key via operator[]
std::cout << test::tmap[1];
// Attempt 2: access key via at()
std::cout << test::tmap.at(1);
return 0;
}
If I have Attempt 1 in my code, Visual Studio's compiler insists I'm using a binary [ operator that hasn't been defined, but that doesn't really make sense to me because as far as I know there is no binary [ operator, (braces are always unary, right?).
So, why doesn't Attempt 1 work?
The problem is std::unordered_map::operator[] is not const, because it inserts the specified key to the map if it doesn't already exist. Since it is not const you cannot use it with a const object. std::unordered_map::at does have a const overload so it compiles. You either need to make test non-const or just use the at() function.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With