代码之家  ›  专栏  ›  技术社区  ›  abhithakur88

自动转换错误

  •  4
  • abhithakur88  · 技术社区  · 13 年前
    class Sample
    {
    public:
      Sample();
      Sample(int i);
      Sample(Sample& s);
      ~Sample();
    };
    
    Sample::Sample()
    {
      cout<<"Default constructor called\n";
    }
    
    Sample::Sample(int i)
    {
      cout<<"1-argument constructor called\n";
    }
    
    Sample::Sample(Sample& s)
    {
      cout<<"Copy constructor called\n";
    }
    
    Sample::~Sample()
    {
      cout<<"Destructor called\n";
    }
    
    void Fun(Sample s)
    {
    
    }
    
    int main()
    {
      Sample s1;
      Fun(5);
    
      return 0;
    }
    

    我期望5的隐含转换。 但是,当我编译上面的代码时,我会得到以下错误:

    main.cpp:7:8: error: no matching function for call to ‘Sample::Sample(Sample)’
    main.cpp:7:8: note: candidates are:
    Sample.h:10:3: note: Sample::Sample(Sample&)
    Sample.h:10:3: note:   no known conversion for argument 1 from ‘Sample’ to ‘Sample&’
    Sample.h:9:3: note: Sample::Sample(int)
    Sample.h:9:3: note:   no known conversion for argument 1 from ‘Sample’ to ‘int’
    Sample.h:8:3: note: Sample::Sample()
    Sample.h:8:3: note:   candidate expects 0 arguments, 1 provided
    Helper.h:6:13: error:   initializing argument 1 of ‘void Fun(Sample)’
    

    问题出在哪里?当我删除复制构造函数时,上面的代码编译成功。

    提前谢谢。

    1 回复  |  直到 13 年前
        1
  •  6
  •   Luchian Grigore sgryzko    13 年前

    临时引用不能绑定到非常量引用。您的复制构造函数应该是:

    Sample::Sample(const Sample&)
    

    删除它会告诉告诉生成一个普通的签名,它将具有上述签名。