string :: c_str()和string :: data()无法转换为const char *

时间:2011-07-27 14:09:33

标签: c++

我在一个定义为std::map<const char*, double>的类中有一个map结构,在构造函数中,我添加了三个全部设置为零的元素,它们的键为“MR_WP”,“MR_WM”和“MR_WC” 。我还有几个访问函数到地图,但在执行访问之前,有一个函数检查以确保键实际存在于地图中。

基本上,我有一些话说:

if ( map.find(_key) == map.end() ) throw "error"

当我将const char *字符串传递给访问函数(如getValue(“MR_WP”))时,没有错误。

但是,如果我这样做:

std::string str = "MR_WP";

double value = map.getValue( str.c_str() );

-or-

std::string str = "MR_WP";

double value = map.getValue( str.data() );

然后抛出错误。我尝试了两个函数,因为我认为错误可能是由null字符引起​​的。我需要这样做的原因是因为我想在运行时获取密钥的最后一个字母,例如:

std::string type = getType();

std::string str = "MR_W" + type;

double value = map.getValue( str.c_str() ); //or with str.data()

1 个答案:

答案 0 :(得分:13)

如果你的地图是std::map<char const*, int>,那么 - 默认情况下 - 通过比较指针而不是词汇值来比较你的键。

回想一下when you do this会发生什么:

const char* str1   = "Some string";
const char  str2[] = "Some string";

std::cout << (str1 == str2 ? "true" : "false");
// Output: false

使用std::map<std::string, int>代替;它不仅不会让你陷入所有权问题的泥潭,而且它还带有一个现成的比较器!