为什么c ++累积第三个参数类型导致编译失败

时间:2013-05-31 10:04:49

标签: c++

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

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 个答案:

答案 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*Tconst 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());