无法从 'const std::string [3]' 转换为 'std::string'

Posted

技术标签:

【中文标题】无法从 \'const std::string [3]\' 转换为 \'std::string\'【英文标题】: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,可以正常复制。 我修好了。谢谢! 【参考方案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 哦,我不知道。谢谢,已编辑。

以上是关于无法从 'const std::string [3]' 转换为 'std::string'的主要内容,如果未能解决你的问题,请参考以下文章

将字符串从 std::string 转换为 const char * 时出现数据丢失问题

不存在从“const std::string”到“char *”的合适转换函数?

在 std::unordered_set<const char *> 中找不到转换为 const char * 的 std::string

如何在 C++ 中将 std::string 转换为 const char [重复]

没有合适的从“const std :: string”到“time_t”的转换函数

返回 const std::string& 的方法应该返回 const std::string_view 吗?