非成员函数operator +(...)不能有cv-qualifier

时间:2016-03-21 15:47:02

标签: c++

我目前正在编写一个模拟盒子中的气体的程序。但我遇到了类操作员的问题。不幸的是,为了让烦人的事情被称为Vector,我知道有些人不会喜欢它被称为。

Vector.h

class Vector {
private:

double x;
double y;
double z;

public:

Vector & operator+=(const Vector & v){
    x += v.x;
    y += v.y;
    z += v.z;
    return *this;
}

我编写了上面的代码,使这个问题更加清晰。我遗漏了构造函数等,因为它们不会影响问题。

对于.cpp

Vector.cpp

Vector operator+(const Vector v) const{
Vector v2(*this);
v2+=v;
return v2;
}

他的生活错误:

C:\ Users \ XXXXX \ ClionProjects \ XXXXX \ YYYYY \ Vector.cpp:95:34:错误:非成员函数'向量运算符+(向量)'不能有cv-qualifier

C:\ Users \ XXXXX \ ClionProjects \ XXXXX \ YYYYY \ Vector.cpp:在函数'Vector operator +(Vector)'中:

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

错误告诉你错了什么。您创建了这些非成员函数,但它们应该是成员函数。编译器通过(正确)使用const来检测问题,尽管缺少参数的数量,并且在修复第一个参数后会出现进一步的编译错误。

要么您忘记将这些功能定义放在class Vector { ... };区域内,要么忘记在Vector::之前写operator

答案 1 :(得分:1)

只有成员函数才能有const个说明符。您的运算符都是非成员函数(因为它们缺少类名作为其签名的一部分),并且未在类定义中定义。

因此,您有编译错误。

要修复此错误,您需要将operator+翻译为自由函数:从Vector类中删除它的声明,并将其sigature更改为(最简单的形式):

Vector operator+ (const Vector& lhs, const Vector& rhs);

有一些理由使用不同的签名,并按值接受第一个参数,但这对于你的级别来说太深了,所以我建议现在坚持使用const引用。

答案 2 :(得分:1)

感谢其他投入,两者都有其优点。我根据Barry @BarryTheHatchet给出的答案找到了我自己的答案。和其他来源。 为了解决这个问题,我在公共部分的头文件中移动了定义,给了我:

 Vector & operator+=(const Vector & v){
    x += v.x;
    y += v.y;
    z += v.z;
    return *this;
}

Vector operator+(const Vector v) const {
    Vector VecPlus(*this);
    VecPlus.x += v.x;
    VecPlus.y += v.y;
    VecPlus.z += v.z;
    return VecPlus;
}

这是结果,我希望它是一种合法的编码方式,而不是一种狡猾的方式,但会导致后来的问题。我的项目进展顺利,到目前为止还没有提出。