hellomyprogram 发表于 2023-7-30 10:37:31

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 的问题吗?应该怎样修复?

陶远航 发表于 2023-7-30 10:37:40

错误是因为在成员函数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()函数返回的是非零值,以避免除以零的错误。
如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-7-30 10:37:41

是的,错误是由于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修饰符的错误,而你的代码也能正确运行。

Mike_python小 发表于 2023-7-30 10:37:58

关于错误信息:

编译器报错指出在 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]
查看完整版本: c++ const 传参