【问题标题】:(C++) string literal doesn't match argument list(C++) 字符串文字与参数列表不匹配
【发布时间】:2019-01-16 10:25:13
【问题描述】:

我正在关注 Tony Gaddis 的一本名为“从 C++ 开始:从控制结构到对象”的 C++ 书籍。

有一个我收到错误的编程示例。该程序为一个接受两个参数的类创建一个构造函数。这两个参数是指向字符的指针。这是课程的一部分:

class ContactInfo
{
private:
    char *name;
    char *phone;
public:
    ContactInfo(char *n, char *p)
    {
        name = new char[strlen(n) + 1];
        phone = new char[strlen(p) + 1];
        strcpy(name, n);
        strcpy(phone, p);
    }
}

当创建 ContactInfo 类的对象时,程序将这些值传递给构造函数。

ContactInfo entry("Kristen Lee", "555-2021");

这一切对我来说似乎都有意义,但是在将“Kristen Lee”传递给构造函数时出现错误。错误说:

“没有构造函数“ContactInfo::ContactInfo”的实例与参数列表匹配。参数类型为:(const char[12], const char[9])”

我不明白为什么会出现此错误。我唯一能想到的是我们试图将一个值传递给一个保存内存地址的变量。但是,我对编程知之甚少,无法知道是否是这种情况。如果它根本不起作用,我怀疑这会出现在教科书中。也许这是一个视觉工作室问题(我正在使用的 IDE)?我非常感谢我能在这个问题上得到的任何帮助。

【问题讨论】:

  • 字符串文字(你的参数)是const;那些参数ContactInfo(char *n, char *p) 不是。因此,有匹配。坦率地说,如果允许任何注定的事情,std::string 无论如何都会优先处理大部分事情。

标签: c++ class constructor char arguments


【解决方案1】:

字符串文字(例如"Kristen Lee")是const char*:您的程序无法修改它。由于ContactInfo 的构造函数只接受char*,因此字符串字面量不匹配。

这是在编译器消息中列出的:

没有构造函数“ContactInfo::ContactInfo”的实例与参数列表匹配。 参数类型有:(const char[12], const char[9])

在这里,编译器告诉您函数 ContactInfo::ContactInfo 不匹配,并且您作为 const char[12]const char[9] 传递的参数。

改用std::string 可以很容易地解决您的问题:

#include <string>
class ContactInfo
{
private:
    std::string name;
    std::string phone;
public:
    ContactInfo(std::string n, std::string p) : name{n}, phone{p}
    {}
};

请注意这让您的代码变得多么简单,因为您不再需要 4 行代码并管理自己的内存。

【讨论】:

  • 感谢您的帮助。当我将构造函数参数列表更改为 (const char *n, const char *p) 时,问题得到了解决。使用 std::string 是更好的解决方案,我只是想按照教科书上显示的方式编写程序。
【解决方案2】:

字符串文字可以衰减为char const*,而不是char*。因此,您应该将构造函数更改为使用char const*

ContactInfo(char const* n, char const* p) { ... }

作为一般原则,除非您希望函数修改其参数,否则将其设为const。这总是一个更好的选择。它允许使用const 对象和非const 对象来使用该函数。这适用于传递指针以及对对象的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多