13

尝试编译以下代码时遇到问题:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>

using namespace std;

map<char, int> mapDial;

mapDial['A'] = 2;

int main()
{

  cout << mapDial['A'] << endl;
  return 0;
}

编译器给了我一个错误:“mapDial”没有命名类型错误。我是 C++ 新手,真的不知道这里发生了什么。这里有人可以帮我解决这个问题吗?谢谢!!

4

3 回答 3

17

您不能在全局范围内执行任意表达式,因此

mapDial['A'] = 2;

是非法的。如果你有 C++11,你可以做

map<char, int> mapDial {
    { 'A', 2 }
};

但如果你不这样做,你将不得不调用一个初始化函数main来设置你想要的方式。您还可以查看map带有迭代器的构造函数,并将其与函数中的数组一起使用来初始化映射,例如

map<char, int> initMap() {
    static std::pair<char, int> data[] = {
        std::pair<char, int>('A', 2)
    };

    return map<char, int>(data, data + sizeof(data) / sizeof(*data));
}

map<char, int> mapDial = initMap();
于 2012-10-23T22:21:12.843 回答
5

在全局范围内声明变量时,您只能进行初始化。例如,

int a = 0;

你不能做正常的陈述,比如:

a = 9;

所以我会修复代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>

using namespace std;

map<char, int> mapDial;

int main()
{
  mapDial['A'] = 2;
  cout << mapDial['A'] << endl;
  return 0;
}
于 2012-10-24T00:19:06.230 回答
4

你不能有像mapDial['A'] = 2;在全球范围内的陈述。它们必须在函数内部。

于 2012-10-23T22:22:31.300 回答