2016-03-21 50 views
1

我目前正在编写一个程序来模拟盒子中的气体。但是我遇到了班主任的问题。不幸的是,让烦人的事情被称为Vector,我知道有些人不喜欢它被称为这个。非成员函数操作符+(...)不能有cv-限定符

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; 
} 

我已经editted上面的代码,使这个问题更加清晰。因为他们不影响问题,所以我省去了施工人员等。

而对于的.cpp

Vector.cpp

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

而他yeilds错误:

C:\用户\ XXXXX \ ClionProjects \ XXXXX \ YYYYY \ Vector.cpp:95: 34:error:非成员函数'Vector operator +(Vector)'不能有cv-qualifier

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

任何帮助非常感谢。

+0

@BarryTheHatchet我把这个问题解释为一个错字(只是缺少声明符)。鉴于它实际上是完全不同的功能,显然不是这种情况...... – Barry

回答

2

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

您忘了将这些函数定义放在class Vector { ... };区域内,或者您忘记在operator之前写入Vector::

+1

'operator +'当然**不应该是一个成员函数。我觉得这个答案令人困惑。 – SergeyA

+1

你为什么说'operator +'不应该是一个成员函数?这可能是... –

+0

@SergeyA:这是你的意见。这不是事实。我坚持_事实_。 –

1

只有成员函数可以有const说明符。两个操作符都是非成员函数(因为它们缺少类名称作为其签名的一部分),并且没有在类定义中定义。

因此,您有编译错误。

要修正这个错误,你需要operator+转化为一个自由的功能:从您的Vector类中删除它的声明,并改变它的sigature到(最简单的形式):

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

有使用某种原因不同的签名,并接受第一个参数的价值,但这对你的关卡来说太深了,所以我建议现在坚持const参考。

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; 
} 

这是结果,我希望它是编写它一个合法的方式,而不是shody办法这样做,但会导致后来的问题。我已经在我的项目中取得了进展,迄今为止没有提出任何建议。

+0

在第二个函数中,如果您使参数非''constst',那么您可以直接使用'v'并避免创建'VecPlus',它目前是一个超额副本。 –

相关问题