这是什么意思? :注意:参数1从'int'到'const account&'

时间:2016-01-02 09:59:14

标签: c++

我试图理解我们通常在C ++程序中遇到的错误的含义。

在编译程序时我遇到了错误(我故意做了这个错误,请不要告诉它如何纠正)并且有一个注释:

note:   no known conversion for argument 1 from ‘int’ to ‘const account&’

我想了解本说明的含义。

我的节目是:

#include<iostream>
class account
{
    private:
        int a_no;
    public:
        account()
        {
            a_no = 0;
        }
        void showData()
        {
            std::cout<<"\n account number = "<<a_no<<std::endl;
        }
};
int main()
{
    account a1;
    a1.showData();
    account a2(2);
    a2.showData();
    return 0;
}

我知道我没有定义一个可以接受一个参数的构造函数,这样做会删除我的错误。

好的,在编译时我得到了:

file1.cpp: In function ‘int main()’:
file1.cpp:20:17: error: no matching function for call to ‘account::account(int)’
     account a2(2);
                 ^
file1.cpp:20:17: note: candidates are:
file1.cpp:7:9: note: account::account()
         account()
         ^
file1.cpp:7:9: note:   candidate expects 0 arguments, 1 provided
file1.cpp:2:7: note: account::account(const account&)
 class account
       ^
file1.cpp:2:7: note:   no known conversion for argument 1 from ‘int’ to ‘const account&’

我想知道最后一行file1.cpp:2:7: note: no known conversion for argument 1 from ‘int’ to ‘const account&’的含义是什么?

3 个答案:

答案 0 :(得分:3)

1)您已经知道没有构造函数接受int。 2)您知道您正在尝试使用int构建帐户。 3)如果你不这样做,编译器将创建默认的复制构造函数,赋值运算符 4)默认的复制构造函数采用const引用到帐户

那么这里发生了什么?由于只有一个默认构造函数,并且您使用一个参数构造,编译器认为您要复制构造。当你给他一个int作为copy-constructor的参数时,编译器会尝试将int转换为一个帐户 - 这不起作用,他告诉你它:“不能从int转换到帐户”

这一点非常重要,因为这是许多错误的来源。你可能不想调用复制构造函数。但是,如果编译器确实找到了将您用作参数的类型转换为帐户的方法,会发生什么?乱七八糟......

答案 1 :(得分:1)

  

我想知道最后一行file1.cpp的含义是什么:2:7:注意:参数1从'int'到'const account&amp;'没有已知的转换?

首先,消息告诉你

  

没有匹配函数来调用'account :: account(int)'

有两个候选人,第一个是默认的ctor,但是

  

file1.cpp:7:9:注意:候选人需要0个参数,1提供

第二个是复制ctor(隐式生成),其参数类型为const account&,但

  

file1.cpp:2:7:注意:参数1从'int'到'const account&amp;'没有已知的转换

答案 2 :(得分:0)

类构造函数是一个像其他函数一样的简单函数,因此当您将int类型作为参数发送到函数时,需要为函数定义参数类型:

class account
{
    private:
        int a_no;
    public:
        account(int a){ a_no = a; }     
};

现在,当你输入为构造函数定义的account a2(2); int类型时,没有任何问题