错误:const类型为c ++

时间:2017-02-12 03:16:59

标签: c++ templates struct initialization c++03

我正在编写一个传递一个我不想修改的结构类型的程序。此结构有两个const成员,如下所示:

struct system_s {
  std::string name;
  std::string pkg;
  char *const start_cmd[10];
  char *const end_cmd[10];
  bool ros;

  bool equals(const system_s &cmp);
};

结构存储在具有以下格式的地图中。这是一个班级成员:

std::map<std::string, system_s> sys_map;

还有另一张临时地图。如果您愿意,可以将sys_map视为缓存。但实际上你不必担心它是如何被用于这个问题的。正在调用sys_map以将系统添加到临时地图,如下所示。它是一种类方法:

add_system(sys_map[msg->system]);(*)

此功能具有以下定义。这是一种类方法:

int add_system(const system_s &sys);

调用(*)时,出现以下错误:

system.h: In instantiation of ?std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = std::basic_string<char>; _Tp = system_s; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, system_s> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = system_s; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::basic_string<char>]?:
/tc_manager_node.cpp:74:41:   required from here
/system.h:26:8: error: uninitialized member ?system_s::start_cmd? with ?const? type ?char* const [10]? [-fpermissive]
 struct system_s {
        ^
system.h:26:8: error: uninitialized member ?system_s::end_cmd? with ?const? type ?char* const [10]? [-fpermissive]
In file included from /usr/include/c++/4.8/map:61:0,
                 from /opt/ros/indigo/include/ros/console.h:42,
                 from /opt/ros/indigo/include/ros/ros.h:40,
                 from 

/tc_manager_node.cpp:2:     /usr/include/c++/4.8/bits/stl_map.h:469:59:注意:合成方法?system_s :: system_s()?首先需要在这里                __i = insert(__ i,value_type(__ k,mapped_type()));

为什么这个类型为system_s的成员'未初始化'?它可能已存储在sys_map中已初始化。是否与在system_s中传递int add_system(const system_s &sys)作为参考有关?

3 个答案:

答案 0 :(得分:1)

正如@Greg Kikola所说,const成员必须才能被初始化。点击此处了解如何使用初始值设定项列表(不要与std::initializer_list混淆):http://en.cppreference.com/w/cpp/language/initializer_list

答案 1 :(得分:1)

带指针的const的位置有时会令人困惑。 X * const p表示:

  

“p是指向非const的X的const指针”:您无法更改指针p本身,但您可以通过p更改X对象。 [source]

这意味着创建的system_s地址永远不会被更改。这是不好的,因为您不是构造函数初始化start_cmdend_cmd这意味着10个指针中没有一个可以被分配有效地址。它们以未初始化的地址开头,永远不会被分配任何其他内容。

修改 这篇文章被标记为:。在C ++ 03中没有直接的方法来初始化数组。您可以查看此问题以获取一些解决方法:Initializing a member array in constructor initializer如果您能够使用,则可以使用List Initialization

答案 2 :(得分:1)

operator[] map(您使用sys_map[msg->system]调用)可能会在找不到地图条目时创建新条目。新条目是默认构造的,但您的类不是默认构造的。

要解决此问题,请勿在地图上使用[]。而是使用find来查找您要查找的条目。