如何将键映射到结构等本机数据类型?
我写了这个剪辑但我无法编译它。您对如何修复它有什么想法吗?
#include <map>
#include <iostream>
typedef struct _list
{
int a,b;
}list;
map<int,list> test_map;
int main(void)
{
cout <<"Testing"<< endl;
}
答案 0 :(得分:4)
map驻留在std :: namespace中。解决这个问题的两种可能方法:
using namespace std;
// ...
map<int, list> test_map;
或
std::map<int, list> test_map;
我更喜欢第二种方法,但这纯粹是个人选择。
在相关的说明中,除了必须是可复制/可分配的事实以及密钥类型必须具有&lt;之外,对于您可以放在地图中的内容没有实际限制。运算符(或者您也可以提供比较器仿函数)。
编辑:似乎<list>
似乎包含在<iostream>
(不太可能)或<map>
中(奇怪但并非不可能)。 using namespace std将导致std :: list与您自己的struct冲突。解决方案:重命名结构,或删除using命名空间并将std ::放在需要它的地方。
答案 1 :(得分:2)
在必要时添加了std
。
将列表重命名为mylist
,以避免与std::list
发生冲突。避免使用与常见用法冲突的类型名和变量名。
现在在VS2008中编译好了。
#include <map>
#include <iostream>
typedef struct _list
{
int a,b;
} mylist;
std::map<int,mylist> test_map;
int main(void)
{
std::cout <<"Testing"<< std::endl;
return 0;
}
在STL容器中使用结构没有问题,前提是它可以完全复制(复制构造函数),可分配(实现operator=
)和可比较(实现operator<
)。
答案 2 :(得分:1)
这里有很多问题:
您缺少using::std
或std::map
,因此编译器不知道map<int,list>
的含义。
假设您有using namespace std
声明,则typedef list
可能会与同名的STL集合发生冲突。更改名称。
你的typedef struct _tag {...} tag;
构造是80年代的古老遗留物。这不是必要的,坦率地说是相当愚蠢的。它什么也没得到你。
这是你修改的代码:
#include <map>
#include <iostream>
struct MyList
{
int a,b;
};
std::map<int,MyList> test_map;
int main(void)
{
std::cout <<"Testing"<< std::endl;
return 0;
}
答案 3 :(得分:0)
你好像是来自C.试试这个:
#include <map>
#include <iostream>
struct list
{
int a,b;
};
std::map<int,list> test_map;
int main(void)
{
std::cout <<"Testing"<< std::endl;
return 0;
}
答案 4 :(得分:0)
map<int, _list> test_map;
或者不要使用list
(更好)作为结构名称。 (你可能还有
#include <list>
...
using namespace std;
代码中的某处。
答案 5 :(得分:0)
我会尽量避免使用键盘。
我已经对您的代码进行了几次测试,似乎
using namespace std
- 它不要求您限定map
,cout
或endl
。 #include <list>
。 这意味着当编译器查看代码时,它会看到两个list
,您的版本和std
中的版本。由于using指令,两者都在您创建映射的行的范围内,并且编译器无法确定使用哪个。
您可以做两件简单的事情:将简单测试的类型名称更改为list
以外的其他内容(哎哟!强制命名选择的工具!)或完全符合使用条件:
#include <map>
struct list {
int a,b;
};
std::map< int, ::list > the_map;
// ...
请注意 codepad 是自己添加include和using指令,所以它也会编译:
struct list {
int a,b;
};
map<int,::list> the_map;
但那段代码错误