C++ 错误:常量类型为c+的单位化成员+;

C++ 错误:常量类型为c+的单位化成员+;,c++,templates,struct,initialization,c++03,c++11,C++,Templates,Struct,Initialization,C++03,C++11,我正在编写一个程序,它传递一个我不想修改的结构类型。此结构有两个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系统

我正在编写一个程序,它传递一个我不想修改的结构类型。此结构有两个
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系统图

还有一张临时地图。如果您愿意,可以将
sys\u map
视为缓存。但实际上,你不必为这个问题担心它是如何被使用的<正在调用code>sys\u map
将系统添加到临时映射,如下所示。它位于类方法中:

add_系统(系统映射[msg->system])(*)

此函数具有以下定义。它是一种类方法:

int-add_系统(const-system&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 
system.h:在?std::map::mapped_type&std::map::operator[](const key_type&)的实例化中[with _key=std::basic_string;_Tp=system_s;_Compare=std::less;_Alloc=std::分配器;std::map::mapped_type=system_;std::map::key_type=std::basic_string]?:
/tc_管理器_节点。cpp:74:41:此处为必填项
/system.h:26:8:错误:未初始化的成员?system_s::start_cmd?和?康斯特?类型?字符*常量[10]?[-fpermissive]
结构系统{
^
system.h:26:8:错误:未初始化的成员?system_s::end_cmd?带有?const?type?char*const[10]?[-fppermissive]
在/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,
从…起
/tc_管理器_节点。cpp:2: /usr/include/c++/4.8/bits/stl_-map.h:469:59:注意:合成方法?system_-s::system_-s()?这里首先需要 __i=插入(uuu i,值类型(uu k,映射类型())


为什么system\u s类型的此成员是“未初始化的”?它可能存储在
sys\u map
中已初始化。它是否与将
system\u s
作为
int add\u system(const system\u s&sys)中的引用传递有关

正如@Greg Kikola所说,
const
成员必须进行初始化。在这里检查如何使用初始值设定项列表进行初始化(不要与
std::initializer\u list
混淆):

正如@Greg Kikola所说,
const
成员必须进行初始化。在这里检查如何使用初始值设定项列表进行初始化(不要与
std::initializer\u list
混淆):

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

“p是指向非常量X的
const
指针:您不能更改指针p本身,但可以通过p更改X对象

这意味着创建
系统\u s
时使用的地址永远不能更改。这是不好的,因为您没有初始化
start\u cmd
end\u cmd
这意味着10个指针中没有一个可以分配有效地址。它们以未初始化的地址开始,并且永远不能分配任何内容e

编辑:
这篇文章被标记为:。在C++03中没有直接的方法来初始化数组。你可以看看这个问题,寻找一些解决方法:如果你有能力,你可以使用它。

常量和指针的位置有时会令人困惑。
X*const p
表明:

“p是指向非常量X的
const
指针:您不能更改指针p本身,但可以通过p更改X对象

这意味着创建
系统\u s
时使用的地址永远不能更改。这是不好的,因为您没有初始化
start\u cmd
end\u cmd
这意味着10个指针中没有一个可以分配有效地址。它们以未初始化的地址开始,并且永远不能分配任何内容e

编辑:
这篇文章被标记为:。在C++03中没有直接的方法来初始化数组。你可以看看这个问题,寻找一些解决方法:如果你有能力,你可以使用。

映射的
操作符[]
(你用
系统映射[msg->system]
调用它)如果找不到映射项,则有可能创建新项。新项是默认构造的,但您的类不是默认可构造的


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

地图的
操作符[]
(使用
系统地图[msg->system]
调用该操作符)如果找不到映射项,则有可能创建新项。新项是默认构造的,但您的类不是默认可构造的


要解决此问题,请不要使用
[]
在映射图上。改为使用
find
查找您要查找的条目。

const
类成员必须在对象构造过程中初始化。
start\u cmd
end\u cmd
未初始化。哪种变量类型可以转换为
char*const*
?我一直有问题你从哪里得到char*const*
也许
char*const start\u cmd[10]
不是存储您试图存储的任何内容的最佳方法
常量
类成员必须在对象构造期间初始化。
start\u cmd
end\u cmd
没有初始化。可以将哪个变量类型转换为
char*const*
?我一直在使用该转换时遇到问题。您从哪里得到的使用
char*const*
from可能
char*const start_cmd[10];
不是存储您试图存储的内容的最佳方式我是否能够使用构造函数初始化
start\u cmd