4

我在编辑器中编写了以下代码,但无法编译,它会发出警报:

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;
}

我不知道为什么它无法编译,请有人帮助我。谢谢:)

4

4 回答 4

6

C++11 标准的第 26.7.2/1 段规定:

template <class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);

[...]

1效果:通过使用初始值 init 初始化累加器 acc 来计算其结果,然后按顺序对范围内 acc = acc + *i的每个迭代器使用 [...]对其进行修改。i[first,last)

[...]

字符串文字具有 type ,当您将它们传递给函数时会const char[]衰减。const char*因此,您传递给的初始化程序accumulate()将是 a const char*,并且T将是 a const char*

这意味着acc从上面的表达式将是 a const char*,并且*i将是 a string。这意味着以下内容将无法编译:

acc = acc + *i;

因为acc + *i产生 a std::string,并且在作业的左侧有一个const char*.

正如其他人所建议的那样,您应该这样做:

 string num = accumulate(v.begin(),v.end(),string());

此外,您无需执行以下操作:

v.push_back(string("a"));

将字符串插入向量时。这就够了:

v.push_back("a");

Anstd::string将从字符串字面量隐式构造"a"

于 2013-05-31T10:15:39.837 回答
4

的模板参数之一std::accumulate是返回类型,它可以从第三个函数参数推导出来。这也是一种应该能够在输入迭代器范围内累积值的类型。在您的情况下,您的返回类型应该是std::string,但您正在传递"",即 a const char[2]。这不是一种可以复制并用于累积的类型。

你可以通过传递一个来解决这个问题std::string

string num = accumulate(v.begin(),v.end(), std::string());
于 2013-05-31T10:11:09.637 回答
1

而不是""作为第三个参数,显式调用std::string()

string num = accumulate(v.begin(),v.end(),std::string());
于 2013-05-31T10:08:46.837 回答
0

of 的返回类型std::accumulate与第三个参数的类型相同,const char*在您的情况下推断为(因为您正在传递字符串文字)。

这意味着该函数期望在const char*内部使用 s,但迭代器范围包含std::strings,因此它会出错。这就是为什么您必须std::string在第三个参数中传递正确的类型 ( ):

string num = accumulate(v.begin(), v.end(), std::string());
于 2013-05-31T10:13:01.720 回答