c++ const 传参
我定义了一个向量类,声明是这样:class Vector
{
public:
unsigned short dimensions = 0;
double *values = nullptr;
Vector(const Vector &);
Vector(unsigned short, double []);
~Vector();
Vector operator+(const Vector &);
Vector operator+(const double);
Vector operator-();
Vector operator-(const Vector &);
Vector operator-(const double);
Vector operator*(const Vector &);
Vector operator*(const double);
Vector operator/(const double);
double dot(const Vector &);
double length();
Vector length(const int);
double angle(const Vector &);
};
在 Vector::angle 函数的实现中编译器发出了错误:
#include <cmath>
double Vector::angle(const Vector &other)
{
return acos(this->dot(other) / (this->length() * other.length()));
};
错误是这么说的:
line 4: return acos(this->dot(other) / (this->length() * other.length()));
没有与参数列表和对象匹配的 重载函数 "Vector::length" 实例(对象包含阻止匹配的类型限定符)C/C++(1087)
这是怎么回事,是 const 的问题吗?应该怎样修复? 错误是因为在成员函数Vector::length()的名称与参数列表中的另一个成员函数Vector::length(const int)冲突,编译器无法确定要调用哪个函数。这是一个名称隐藏的问题。解决方法是在调用时显式指定要调用的函数。
在Vector::angle()函数的实现中,将以下代码:
return acos(this->dot(other) / (this->length() * other.length()));
修改为:
return acos(this->dot(other) / (this->length()() * other.length()));
通过在this->length()后面添加额外的括号,明确指定要调用的是不带参数的Vector::length()函数。这样就可以解决名称冲突的问题。
请注意,在修复了上述问题后,确保所调用的Vector::length()函数返回的是非零值,以避免除以零的错误。
如果问题已经解决,请设置最佳答案 是的,错误是由于const修饰符引起的。在 C++ 中,如果成员函数被声明为const ,表示它不会修改对象的状态,即它不会修改成员变量的值。在你的情况下,编译器指出了问题: Vector::length函数没有一个const修饰符的重载版本,所以无法在Vector::angle函数中调用this->length()和other.length() 。
要修复这个问题,你需要在Vector::length函数声明中添加const修饰符,表示它是一个只读函数,不会修改对象的状态。修改方式如下:
class Vector
{
public:
// ... 其他成员函数
double length() const; // 在这里添加 const 修饰符
};
然后,在实现文件中对应的函数定义也要加上const修饰符:
#include <cmath>
double Vector::length() const // 在这里添加 const 修饰符
{
// 函数实现
}
通过在Vector::length函数声明和定义中添加const修饰符,编译器就能够正确地识别length()函数为只读函数,并允许在Vector::angle函数中调用this->length()和other.length()了。
这样,问题就会得到解决,编译器不再报告关于缺少const修饰符的错误,而你的代码也能正确运行。 关于错误信息:
编译器报错指出在 Vector::angle 函数的实现中,没有与参数列表和对象匹配的重载函数 "Vector::length" 的实例。这意味着编译器无法找到匹配的函数重载形式来调用 length() 函数。
修复方法:
问题出在你在类定义中同时声明了两个名为 length 的成员函数,其参数列表不同:
double length(); // 第一个 length() 函数
Vector length(const int);// 第二个 length() 函数
由于这两个函数的参数列表不同,导致在 Vector::angle 函数中调用 this->length() 时,编译器无法确定到底应该调用哪个函数。
要解决这个问题,你可以修改其中一个 length 函数的名称,或者给它们的参数列表做出一些改变,以确保它们在成员函数之间具有唯一的签名。
以下是一种可能的修复方法,为第二个 length 函数添加一个额外的参数,使其与原来的函数的签名不同:
class Vector {
public:
// ...
double length(); // 第一个 length() 函数
Vector length(const int dimension); // 修改第二个 length() 函数的参数列表
// ...
};
double Vector::length() {
// 实现第一个 length() 函数的代码
}
Vector Vector::length(const int dimension) {
// 实现修改后的第二个 length() 函数的代码
}
通过这种方式,你可以为两个成员函数提供唯一的签名,从而消除编译器中的歧义。
希望这个解答能够帮助到你。如果还有其他问题,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页:
[1]