map
struct
的{{1}}收到以下错误:
Error: invalid types ‘int[unsigned int]’ for array subscript
。
typedef struct {
std::string s;
}re;
re r;
std::map<unsigned int, r> var;
int main(){
struct re{
string s;
}re;
re.s="hello";
var[10]=re;}
如果我在r
的声明中将re
更改为map
,那么我会收到错误:
error: no match for ‘operator=’ in var.std::map<_Key, _Tp, _Compare, _Alloc>::operator[] [with _Key = unsigned int, _Tp = re, _Compare = std::less<unsigned int>, _Alloc = std::allocator<std::pair<const unsigned int, re> >, std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = re, std::map<_Key, _Tp, _Compare, _Alloc>::key_type = unsigned int]((*(const key_type*)(& o) = re’
答案 0 :(得分:2)
地图需要为mapped_type提供类型,并且您要为其提供re
实例r
。你需要
std::map<unsigned int, re> var;
您的代码可以进一步简化:
struct re {
std::string s;
};
int main()
{
re r;
std::map<unsigned int, re> var;
r.s="hello";
var[10]=r;
}
答案 1 :(得分:2)
r
是re
类型的实例,它是您定义的struct
的类型别名。因此,你应该改变这个:
std::map<unsigned int, r> var;
进入他的:
std::map<unsigned int, re> var;
// ^^
另请注意,在main()
过程中,您正在重新定义re
结构,当您很可能只是想创建它的实例时:
int main() {
re r;
r.s="hello";
var[10]=r;
}
因此,把所有东西放在一起:
#include <string>
#include <map>
// Avoid this old C style of defining structs. Prefer the
// C++ style I am showing below...
/*
typedef struct {
std::string s;
} re;
*/
struct re
{
std::string s;
};
int main() {
std::map<unsigned int, re> var;
re r;
r.s="hello";
var[10]=r;
}
答案 2 :(得分:1)
首先,你可以说
struct re { std::string s; };
在C ++中。 typedef struct {...} name;
是C-ism。
在地图中,您必须提供类型而不是变量
std::map<unsigned int, re> var;
您在main()
函数中遇到的错误是因为您尝试将不同类型main()::struct re
的变量分配给地图元素10
,其类型为{{1} }}
总结一下,main中的typedef struct { ... } re
与全局范围中的struct re
的类型不同。
答案 3 :(得分:1)
请更改
std::map<unsigned int, r> var;
到
std::map<unsigned int, re> var;
你定义某种类型的地图,在<>
中传递你想要映射到“地图”的类型(定义它们之间的映射)。
这是所有代码段:
#include <map>
typedef struct {
std::string s;
}re;
re r;
std::map<unsigned int, re> var;
int f(int argc, char** argv) {
re res;
res.s="hello";
var[10]=res;
//and if you want that global variable
r.s="global variable";
var[1]=r;
return ERROR_SUCCESS;
}
答案 4 :(得分:1)
评论内联描述了如何修复代码。
#include <string>
#include <map>
//typedef struct { // This is from C. Use the C++ way...
struct re_type {
std::string s;
//} re; // See above
};
// re r; // You do not need a global instance
// std::map<unsigned int, r> var; // `r` was an instance.
// The map declaration needs a type:
std::map<unsigned int, re_type> var; // Note: This is global and should probably be
// moved into main()
int main(){
// struct re{ // No need to redeclare the struct here
// string s;
// }re;
re_type re; // Create a local instance
re.s="hello";
var[10]=re;
}
re
,r
,s
和var
似乎不是描述性标识符。使用有意义的标识符将使您的代码更易于阅读和维护,甚至可以帮助您理解编译错误。
答案 5 :(得分:0)
typedef struct {
std::string s;
} re;
然后:
std::map<unsigned int, r> var;
罗。模板需要 类型 ,但您要为其提供变量。将其更改为
std::map<unsigned int, re> var;
它会正常工作。