无法<string>从"常量字符 []"转换为<类名>
could not convert <string> from ‘const char []’ to <class name>
>我有一个问题,它构成了以下程序:
class Player {
public:
Player(int new_id);
private:
string name;
int id;
};
class Team {
public:
Team(string new_name);
private:
Player* player;
string name;
};
int main()
{
Team a("Team1");
}
Team::Team(string new_name)
{
name=new_name;
player= new Player[2]{1,2};
}
Player::Player(int new_id)
{
id=new_id;
}
该程序有效,但是当我将其更改为此程序时:
class Player {
public:
Player(string new_name);
private:
string name;
int id;
};
class Team {
public:
Team(string new_name);
private:
Player* player;
string name;
};
int main()
{
Team a("Team1");
}
Team::Team(string new_name)
{
name=new_name;
player= new Player[2]{"Bob","Tom"};
}
Player::Player(string new_name)
{
name=new_name;
}
它给了我这个错误:无法将"鲍勃"从"常量字符 [4]"转换为"播放器"。我不明白。我唯一改变的是我使用字符串而不是 int。 有什么想法吗? 提前感谢!
您的问题是关于用户定义的转换,如C++标准所指定:
转化 [类.conv]
类对象的类型转换可以由构造函数指定,并且 通过转换函数。这些转换称为用户定义 转换,用于隐式类型转换(条款 7(,用于 初始化 (11.6( 和显式类型转换 (8.4、8.2.9(。
问题是:
。最多一个用户定义的转换(构造函数或转换( 函数(隐式应用于单个值。
在您的工作示例中:
player= new Player[2]{1,2};
您有一个用户定义的转换在这里发生:int
通过使用采用int
参数的Player
的构造函数进行Player
。
但在另一种情况下:
player= new Player[2]{"Bob","Tom"};
在这里,您需要进行两个用户定义的转换:使用其构造函数到std::string
的文本 char 字符串,然后是采用std::string
参数的Player
的构造函数。此处需要两个用户定义的转换。C++标准最多允许一个。失败。
我只能想到两种可能的解决方法。一种是手动消除其中一个用户定义的转换:
player= new Player[2]{std::string{"Bob"}, std::string{"Tom"}};
现在只剩下一个用户定义的转换,使用其构造函数从std::string
到Player
。
第二种解决方法是作弊并Player
使用模板构造函数:
class Player {
public:
template<typename Arg>
Player(Arg &&arg)
: name{std::forward<Arg>(arg)}
{
}
private:
std::string name;
int id;
};
这有效地接受Player
构造函数的任何参数,将用户定义的转换之一向下戳到字符串的构造函数。我想,可以在这里进行一些改进,并且只有在std::string
的构造成功时,才能使该构造函数参与重载解析。这将需要更多的工作。
问题是在这个语句中
player= new Player[2]{"Bob","Tom"};
需要两个用户定义的隐式转换。第一个是将字符串文本转换为类型std::string
,第二个是将类型为std::tring
的对象转换为 Player 类型。这是C++标准所不允许的。
若要避免此错误,请向类再添加一个构造函数。例如
class Player {
public:
Player( const std::string &new_name) : name( new_name ) {}
Player( const char *new_name) : name( new_name ) {}
private:
string name;
int id;
};
或者不添加新的构造函数,你可以只写
player= new Player[2]{ Player( "Bob" ), Player( "Tom" ) };
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中