【问题标题】:Cannot convert from 'const std::string [3]' to 'std::string'无法从 'const std::string [3]' 转换为 'std::string'
【发布时间】:2020-05-19 16:56:30
【问题描述】:

这是我的代码:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

template<int N>
class Arguments
{
protected:
    string arguments[N];
public:
    Arguments(const string(&arg)[N]) : arguments{ arg } {}
    string operator[](const int &i) const { return arguments[i]; }
};

int main()
{
    string arr[3] = { "arg1", "arg2", "arg3" };
    Arguments<3> args(arr);

    cout << args[2];

    return 0;
}

这是我得到的错误:

Severity    Code    Description Project File    Line    Suppression State
Error   C2440   'initializing': cannot convert from 'const std::string [3]' to 'std::string'    
coursework_draft    C:\dev\coursework_draft\coursework_draft\coursework_draft.cpp   13  

我需要改变什么?

【问题讨论】:

  • 你不能用另一个数组初始化一个数组,只能按元素初始化。要么使用循环复制元素,要么使用std::array,可以正常复制。
  • 我修好了。谢谢!

标签: c++ string type-conversion


【解决方案1】:

数组在 C++ 中不可复制。所以这永远行不通

 Arguments(const string(&arg)[N]) : arguments{ arg } {}

您可以改用std::array&lt;std::string, N&gt;, 或者您可以在构造函数的主体中逐个元素地复制数组。

【讨论】:

  • 修复了它。谢谢!
  • Arguments(const string(&amp;arg)[N]) : arguments( arg ) {} 似乎也可以工作......有什么问题?
  • @Klaus 这不是合法的 C++。 g++ 正在使用非标准扩展来允许它编译
  • @NathanOliver: 也使用 -pedantic 编译,这应该对此类扩展发出警告......好吧,就像是这样 :-) 谢谢!
  • @Klaus 似乎是 GCC 中的一个错误。
【解决方案2】:

这个:

arguments{ arg }

是列表初始化,意味着arguments 的第一个元素被初始化为arg。但是arguments的元素是std::string,不能用字符串数组初始化。

数组不可复制初始化。

然而,类可以复制初始化,并且它们可以具有数组成员。因此,您可以将类用作可以方便地复制的数组的包装器。标准库有一个用于此类数组包装器的模板。它的名字是std::array

另一种选择是使用std::copy 或类似函数将数组复制到构造函数主体中。

【讨论】:

  • 已修复。谢谢!
【解决方案3】:

你可以使用std::copy:

Arguments(const string(&arg)[N]) {
   std::copy(arg, arg + N, arguments); 
}

这是demo

【讨论】:

  • 我有那些。编译器说使用 { } 来初始化一个数组
  • 这可能适用于 g++,但不适用于 clang 并且不是标准的
  • @NathanOliver 哦,我不知道。谢谢,已编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多