无法从 '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<std::string, N>
,
或者您可以在构造函数的主体中逐个元素地复制数组。
【讨论】:
修复了它。谢谢!Arguments(const string(&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 [重复]