将字符串变量传递给函数而不是固定字符数组时的编译问题

时间:2011-12-03 18:11:56

标签: c++ string char

我正在为我的类构造函数使用初始化列表方法。我通过调用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*)'

我对于出了什么问题一无所知?请指教!

4 个答案:

答案 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 *。