不同范围的函数重载的可见性

问题描述 投票:0回答:2

下面的代码给出错误:

error: ‘double& Sample::GetValue()’ is protected within this context  |   double v = ms.GetValue();
。如果删除受保护的函数,它可以正常编译。是不是编译器的bug,不能选择不同作用域的正确函数重载?

class Sample
{
public:
    Sample() {}
    virtual ~Sample() {}
    const double& GetValue() const {return v;}
    void Print() {std::cout << v << std::endl;}
protected:
    double& GetValue() {return v;}
private:
    double v;
};

class Sample2
{
public:
    Sample2() {}

    void Compute()
    {
        double v = ms.GetValue();
    }

private:
    Sample ms;
};
c++ overloading
2个回答
2
投票

函数的可见性不会改变重载解析规则。这里没有错误,

double& GetValue()
只是比
const double& GetValue() const

更好的候选者

0
投票

The Dreams Wind 说了什么,但编译器不知道你想调用

const double& GetValue() const
(应该是
double GetValue() const
,顺便说一句)因为
ms
没有声明
const
.

虽然有一个简单的解决方法:

void Compute()
{
    const Sample &const_ms = ms;
    double v = const_ms.GetValue();
}

现场演示

© www.soinside.com 2019 - 2024. All rights reserved.