在声明结构图时,如何解决编译错误?

时间:2013-03-17 21:10:03

标签: c++ compiler-errors

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’

6 个答案:

答案 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)

rre类型的实例,它是您定义的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;
}

rersvar似乎不是描述性标识符。使用有意义的标识符将使您的代码更易于阅读和维护,甚至可以帮助您理解编译错误。

答案 5 :(得分:0)

typedef struct {
    std::string s;
} re;

然后:

std::map<unsigned int, r> var;

罗。模板需要 类型 ,但您要为其提供变量。将其更改为

std::map<unsigned int, re> var;

它会正常工作。