【问题标题】:C++: No matching function to call to const charC++:没有匹配的函数来调用 const char
【发布时间】:2025-12-07 13:40:01
【问题描述】:

我试图在 player 类中创建一个名为 player 的对象。

#include <string>
#ifndef PLAYER_HH
#define PLAYER_HH

using namespace std;

class Player
{
public:
    Player(string name, int points);
    const string get_name();
    int get_points();
    void add_points(int pts);
    bool has_won();
private:
    string _name;
};

#endif // PLAYER_HH

来自 player.cpp:

#include <string>

using namespace std;

Player::Player(string name):
    _name(name), _points(0){
}

现在,问题是,在主函数中我得到了这个错误:

 error: no matching function for call to ‘Player::Player(const char [6])’
 Player player1 = Player("Matti");
                                ^

编译器不应该能把它转成字符串吗?

编辑:这是我不应该更改的完整 main.cpp:

#include <cstdlib>
#include <iostream>
#include <string>
#include "player.hh"


int main()
{
    Player player1 = Player("Matti");
    Player player2 = Player("Teppo");
    Player* in_turn = 0;

    int turn = 1;
    while (true)
    {
        if (turn % 2 != 0)
        {
            in_turn = &player1;
        }
        else
        {
            in_turn = &player2;
        }

        std::cout << "Enter the score of player " << in_turn->get_name()
             << " of turn " << turn << ": ";
        int pts = 0;
        std::cin >> pts;

        in_turn->add_points(pts);
        if (in_turn->has_won())
        {
            std::cout << "Game over! The winner is " << in_turn->get_name() << "!" << std::endl;
            return EXIT_SUCCESS;
        }

        std::cout << std::endl;
        std::cout << "Scoreboard after turn " << turn << ":" << std::endl;
        std::cout << player1.get_name() << ": " << player1.get_points() << "p" << std::endl;
        std::cout << player2.get_name() << ": " << player2.get_points() << "p" << std::endl;
        std::cout << std::endl;

        turn += 1;
    }

    return EXIT_SUCCESS;
}

你们的快速回答太棒了:-)

【问题讨论】:

  • "编译器不应该可以将其转换为字符串吗?" 是的,它可以很好地将其转换为std::string。但这不是问题所在:没有声明的构造函数接受std::string,还有一个额外的int 参数您忘记传递给构造函数。
  • 你的声明有Player(string,int),但定义是Player(string)
  • 这是一个作业,我不应该更改 main.cpp。两名球员都有特定数量的积分。有没有办法在不首先声明他们的情况下将 int 点分配给两个玩家?
  • 看我的回答,为 score 参数使用默认值。
  • 如果你不应该更改 main.cpp,你也不应该更改构造函数的原型或删除_points 成员,并且两个玩家都从零开始。

标签: c++ method-parameters


【解决方案1】:

您将播放器的构造函数声明为Player(string name, int points);

如果你定义一个有两个参数的函数,你必须同时使用这两个参数。

创建你的对象

Player player1 = Player("Matti", 0);

如果你仍然想只用一个参数调用它,你必须像这样设置一个默认值。

class Player
{
public:
    ...
    Player(string name, int points = 0); // replace 0 with whatever you want to be default.
    ...
}

然后您可以同时使用这两种变体。上面那个和你尝试过的那个

Player player1 = Player("Matti");

当然,您定义的函数头必须与声明中的函数头匹配:

Player::Player(string name, int points):
    _name(name), _points(points){
}

不要在定义中写入默认值很重要,因为这很可能会产生编译器错误。

【讨论】:

  • 这仍然会导致链接器错误;)函数定义也需要更改
  • @xEric_xD - 我用 GNU 编译器试过这个,我不需要调整定义。如果我尝试为其添加默认值,我什至会收到错误。
  • 这与默认值无关。声明的构造函数 Player(string name, int points); 在 OP 提供的代码中没有定义。他只定义了Player::Player(string name),而后者又没有声明
【解决方案2】:

const char[6]std::string 的转换将起作用,这不是问题。

你的构造函数有两个参数,你不能简单地省略第二个。如果您想使用默认分数创建 Player 对象,请将您的构造函数声明为:

Player(string name, int points = 0);

【讨论】:

    【解决方案3】:

    首先,你声明你的构造函数有两个参数:

    Player(string name, int points);
    

    但将其定义为只有一个:

    Player::Player(string name):
        _name(name), _points(0){
    }
    

    这应该会给你编译错误。从类主体的声明中删除第二个参数并保持 main.cpp 原样,或者将第二个参数添加到 player.cpp 中的定义中:

    Player::Player(string name, int points):
        _name(name), _points(points){
    }
    

    然后明确指定“点”的值:

    Player("Matti", 0);
    

    您也可以两者兼有 - 只需为 points 添加默认值:

    class Player
    {
    ...
       Player(string name, int points = 0);
    };
    

    那么,这两行都会起作用:

    Player player1 ("Matti");
    Player player2 ("Matti", 0);
    

    【讨论】: