繁体   English   中英

C ++错误:没有匹配的函数可调用

[英]C++ error: no matching function for call to

这是我得到的错误:“没有匹配的函数来调用'MemberForTest :: MemberForTest'...”

这是代码:

#include "Base.h"
#include "Date.h"

class MemberForTest: public tp::Base
{
public:
    MemberForTest(std::string& name, std::string& firstname,
            Date& birthday, std::string& telephone);

};




class Member
{
public:
    Member() :
        perso("Hall", "roger", (12,12,1990), "(999) 444-4545")
    {
    };

    MemberForTest perso;
};

Base是一个抽象类。 我的老师使用相同的方法来访问基类的构造函数,而他不需要创建一个函数(MemberForTest :: MemberForTest)。 即使创建函数,该错误仍然存​​在。 你能帮助我吗?

另外,我可能必须传递对象日期(Date date(12,12,1990))而不是(12,12,1990)作为参数。 我怎样才能做到这一点?

用于初始化Date的表达式,即

(12,12,1990)

是一个以int表示的逗号表达式(具体是1990 ,是逗号分隔数字链中的最后一个数字)。 该错误表明intDate不兼容。

修改您的代码以构造Date对象。 不幸的是,您不能内联完成此操作,因为MemberForTest构造函数通过非恒定引用获取Date参数。 如果您更改构造函数以通过常量引用获取参数,例如

MemberForTest(const std::string& name, const std::string& firstname,
        const Date& birthday, const std::string& telephone);

您应该能够做到这一点:

Member() :
    perso("Hall", "roger", Date(12,12,1990), "(999) 444-4545")
{
};

当参数被声明为对非const的引用时,例如std::string& name ,其参数必须是左值(命名对象)。 您正在传递字符串文字-这些是字符数组,而不是std::string ,需要进行转换。 转换的结果是一个临时对象,即右值。 语言规则说,这些不能传递给对非常量的引用。

您需要声明构造函数以采用const std::string& (因为您将不会更改参数),或者首先创建一个std::string类型的对象:

void foo(std::string& s);
std::string str;
foo(str);

同样, (12,12,1990)不会创建临时Date对象(为此,您需要使用功能样式Date(12,12,1990) )。 这是一个带括号的表达式,使用逗号运算符计算左手操作数,将其丢弃,然后返回最右边的操作数(整数常量1990 )。

string参数一样,您需要使用const Date&

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM