无法将<string>从'const char []'转换为<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;
       }

它给了我这个错误:无法将'“ Bob”'从'const char [4]'转换为'Player'。我不明白。我唯一更改的是我使用字符串而不是int。有任何想法吗?提前致谢!

山姆·瓦尔沙夫奇克

您的问题与C ++标准指定的用户定义的转换有关:

转换[class.conv]

类对象的类型转换可以由构造函数和转换函数指定。这些转换称为用户定义转换,用于隐式类型转换(第7章),初始化(11.6)和显式类型转换(8.4、8.2.9)。

问题是:

...最多将一个用户定义的转换(构造函数或转换函数)隐式地应用于单个值。

在您的工作示例中:

player= new Player[2]{1,2};

您在此处int进行Player一个用户定义的转换:通过使用Player带有int参数的构造函数。

但是在另一种情况下:

player= new Player[2]{"Bob","Tom"};

在这里,您需要进行两次用户定义的转换:std::string使用其构造函数将文字字符字符串转换为,然后Player采用std::string参数的构造函数。这里需要两个用户定义的转换。C ++标准最多允许一个。失败。

我只能想到两种可能的解决方法。一种是手动消除用户定义的转换之一:

player= new Player[2]{std::string{"Bob"}, std::string{"Tom"}};

现在仅剩一个用户定义的转换,std::stringPlayer使用其构造函数从转换

第二种解决方法是欺骗并Player使用模板构造函数:

class Player {
public:
    template<typename Arg>
    Player(Arg &&arg)
        : name{std::forward<Arg>(arg)}
    {
    }
private:
    std::string name;
    int id;
};

这有效地接受Player的构造函数的任何参数,将用户定义的转换之一下移到字符串的构造函数。我想,这里可以做一些改进,只有在std::string成功构造成功的情况下,才能使此构造函数参与重载解析这将需要更多的工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章