没有匹配的通话功能

时间:2016-06-17 13:38:38

标签: c++ operator-overloading header-files

我在codeblocks中创建了非常简单的C ++项目。我有头文件(CVector.h),源文件(CVector.cpp)和主代码(code.cpp)。当我尝试编译代码时,我得到以下消息:

CVector.cpp|22|error: no matching function for call to 'CVector::CVector()'|

code.cpp

#include <iostream>
#include "CVector.h"
using namespace std;

int main () {
CVector vec1(1,2);
CVector vec2 (3,4);
cout << "vec1 data "; vec1.printData();
cout << "vec2 data "; vec2.printData();

cout << "vec1 area: " << vec1.area() << endl;
cout << "vec2 area: " << vec2.area() << endl;

return 0;
}

CVector.h

#ifndef CVECTOR_H
#define CVECTOR_H


class CVector
{
   int x,y;
   public:
        CVector (int, int);
        int area();
        void printData ();
        CVector operator+ (CVector param );
};

#endif // CVECTOR_H

CVector.cpp

#include <iostream>
#include "CVector.h"
using namespace std;

CVector::CVector (int a, int b) {
x=a;
y=b;
}

int CVector::area() {return x*y;}

void CVector::printData(){
cout << "X = " << x << ", Y = " << y << endl;
}

CVector CVector::operator+ (CVector param )
{
    CVector temp;
    temp.x=x + param.x;
    temp.y=y + param.y;
    return temp;
}

该错误与操作符重载函数有关,因为当我对此函数进行注释时,它会编译没有问题。

2 个答案:

答案 0 :(得分:2)

-c中,

operator+

需要默认构造函数,但您没有定义一个。
(如果定义了非默认构造函数,编译器将不提供默认构造函数。)

您可以定义默认构造函数,如果您可以决定成员的合适默认值,或者您可以编写

CVector temp;

甚至

CVector CVector::operator+ (CVector param )
{
    CVector temp(x + param.x, y + param.y);
    return temp;
}

答案 1 :(得分:0)

CVector CVector::operator+ (CVector param ) { return CVector(x + param.x, y + param.y); } 中存在的问题是这一行:

operator +

这一行创建一个默认构造的CVector temp; 。但是,您的CVector类没有默认构造函数,因此出错。您需要在课程中添加一个:

CVector

有两种方法可以实现它。之一:

class CVector
{
   int x,y;
   public:
      CVector(); // Added
      //The rest as before
};

这会导致成员CVector::CVector() {} x保持未初始化状态。

二:

y

这会将CVector::CVector() : x(0), y(0) {} x初始化为0。

第二个更安全,第一个更快。使用哪一个取决于你的课程目标。

不相关,但在您的双参数构造函数中,您应该使用成员初始化列表而不是分配:

y

对于CVector::CVector(int a, int b) : x(a), y(b) {} 这样的原始类型来说,它并不重要,但它是一个成长的好习惯。对于具有非平凡默认构造函数的类型的成员来说,它更有效,并且对于类型的成员而言实际上是非常有效的没有默认构造函数。