我正在为我的类构造函数使用初始化列表方法。我通过调用dataRegistry Class的getData成员函数初始化我的变量,该函数提供了加载到我的类变量中的数据。 getData方法通常通过传递一个包含要加载的数据名称的字符数组来调用。
例如初始化列表如下所示:
dataItem1(dr.getData("Pop.Stats1")),
dataItem2(dr.getData("Pop.Stats2"))
但是,由于提供的名称的方式,我需要从用户类中提取数据集的名称,然后附加变量名称以传递给getData方法。像这样:
datasetName(user.getAttributeString("DataSetName")),
dataItem1(dr.getData(datasetName + ".Stats1")),
dataItem2(dr.getData(datasetName + ".Stats2"))
其中datasetName被定义为std :: string变量。
但是,这会引发以下错误:
no matching function for call to 'DataRegistry::GetData(std::basic_string<char,std::char_traits<char>, std::allocator<char> >)'
由于没有向我提供getData方法的实现,并且我知道当我将char数组(例如“Pop.Stat1”)传递给函数时它可以工作,我怀疑这是因为函数接受了字符数组只要。所以,我试过了:
datasetName(user.getAttributeString("DataSetName")),
dataItem1(dr.getData(strcat(datasetName.c_str() , ".Stats1"))),
dataItem2(dr.getData(strcat(datasetName.c_str() , ".Stats2"))),
但这会引发错误:
error: invalid conversion from 'const char*' to 'char*'
initializing argument 1 of 'char* strcat(char*, const char*)'
我对于出了什么问题一无所知?请指教!
答案 0 :(得分:4)
几乎虽然在strcat
的返回值上使用c_str()
会导致未定义的行为。只是做:
(datasetName + ".Stats1").c_str()
所以整行看起来像
dataItem1(dr.getData((datasetName + ".Stats1").c_str())),
因为您通过".Stats1"
将datasetName
连接到string::operator+
,所以您希望const char*
获得该字符串,因此您使用c_str()
operator+
的返回值。
你需要围绕它的括号,因为.
的优先级高于+
,所以如果parens不在那里,你就会在“.Stats1”上调用c_str()
(而不是+
)的返回值,不存在。
答案 1 :(得分:1)
datasetName.c_str()
会返回const char *
- 就像在,您无法修改它 - 它是指向std::string
此外......即使它只是一个char *
,你也不能只将数据附加到它的末尾并称之为好 - 你没有为此分配内存。
附加到std::string
和然后致电c_str()
答案 2 :(得分:1)
如果datasetName是std::string
,则datasetName + "str"
的类型也是std::string
,因此您需要c_str()才能获得const char*
。
dataItem1(dr.getData( (datasetName + ".Stats1").c_str() )),
dataItem2(dr.getData( (datasetName + ".Stats2").c_str() )
但是,在getData
返回后,(datasetName + ".Stats1").c_str()
的值被释放,因此请确保getData
复制char数组的内容。
答案 3 :(得分:0)
错误消息很明确。方法c_str返回一个const char *,但是strcat的第一个参数是char *。