我在编辑器中编写了以下代码,但无法编译,它会发出警告:
cannot convert 'std::basic_string<char, std::char_traits<char>,
std::allocator<char> to 'const char*' in assignment|
||=== Build finished: 1 errors, 0 warnings ===|
代码:
#include <iostream>
//#inclide <algorithm>
#include <numeric>
#include <vector>
using namespace std;
int main()
{
std::vector<std::string> v;
v.push_back(string("a"));
v.push_back(string("b"));
v.push_back(string("c"));
string num = accumulate(v.begin(),v.end(),"");
std::cout << num;
return 0;
}
我不知道为什么不能编译,请有人帮帮我。谢谢:)
答案 0 :(得分:6)
C ++ 11标准的第26.7.2 / 1段规定:
template <class InputIterator, class T> T accumulate(InputIterator first, InputIterator last, T init);
[...]
1 效果:通过使用初始值init初始化累加器来计算其结果然后 对于范围中的每个迭代器
acc = acc + *i
,使用i
[...]修改它[first,last)
按顺序排列。[...]
字符串文字的类型为const char[]
,当您将它们传递给函数时会衰减到const char*
。因此,您传递给accumulate()
的初始值设定项为const char*
,T
为const char*
。
这意味着上面表达式中的acc
将是const char*
,而*i
将是string
。这意味着以下内容无法编译:
acc = acc + *i;
由于acc + *i
会产生std::string
,因此在作业的左侧会有const char*
。
正如其他人所建议的那样,你应该这样做:
string num = accumulate(v.begin(),v.end(),string());
此外,您不需要这样做:
v.push_back(string("a"));
将字符串插入向量时。这就足够了:
v.push_back("a");
std::string
将从字符串文字"a"
中隐式构建。
答案 1 :(得分:4)
std::accumulate
的一个模板参数是返回类型,它将从第三个函数参数中推导出来。这也是一种能够在输入迭代器范围内累积值的类型。在您的情况下,您的返回类型应为std::string
,但您传递的是""
const char[2]
。这不是可以复制并用于累积的类型。
您可以通过传递std::string
:
string num = accumulate(v.begin(),v.end(), std::string());
答案 2 :(得分:1)
而不是""
作为第三个参数,显式调用std::string()
:
string num = accumulate(v.begin(),v.end(),std::string());
答案 3 :(得分:0)
std::accumulate
的返回类型与第三个参数的类型相同,在您的情况下推导为const char*
(因为您传递的是字符串文字)。
这意味着该函数需要在内部使用const char*
,但迭代器范围包含std::string
s,因此它是barfs。这就是你必须在第三个参数中传递正确类型(std::string
)的原因:
string num = accumulate(v.begin(), v.end(), std::string());