Unordered_map <string,int =“”>有效,但Unordered_map <string,string =“”>不</string,> </string,>

时间:2014-04-29 07:45:55

标签: c++ unordered-map

我不明白为什么这个简短示例中的第二个代码块无法正确编译。据我所知,&lt;&gt;中的第二个参数表示值,不需要是唯一的。为什么第二个代码块会抛出编译器错误,我需要做些什么来解决它?

// Unordered Map example .cpp

#include <stdio.h>
#include <string>
#include <cstring>
#include <unordered_map>

using namespace std;

int main(void) {

    // This works as expected
    unordered_map<std::string, int> m;
    m["foo"] = 42;
    printf("%i\n", m["foo"]);

    // This this doesn't compile
    unordered_map<std::string, std::string> m1;
    m1["foo"] = "42";
    printf("%s\n", m1["foo"]);

    return 0;
}

我正在使用

在CentOS 5.8上编译此代码
g++44 -c -Wall -std=c++0x -g map_example.cpp

这些是我得到的错误

map_example.cpp: In function ‘int main()’:
map_example.cpp:20: warning: cannot pass objects of non-POD type ‘struct std::basic_string<char, std::char_traits<char>, std::allocator<char> >’ through ‘...’; call will abort at runtime
map_example.cpp:20: warning: format ‘%s’ expects type ‘char*’, but argument 2 has type ‘int’

如果我遇到基本的c ++类这样的std:string有什么问题需要做什么才能将自定义类作为值,哪里可以找到一个完全实现的最小例子?

2 个答案:

答案 0 :(得分:3)

printf不能与std :: string一起使用。使用cout << m1["foo"]printf("%s", m1["foo"].c_str())

答案 1 :(得分:2)

printf("%s\n", m1["foo"]);是C.

对于c ++,你应该使用std::cout使字符串和int map的值按预期打印出来。

编译器无法自动将std::string对象转换为const char*(默认情况下无法转换为const char*Why does std::string not provide a conversion to const char*?