下面的代码给出错误:
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;
};
函数的可见性不会改变重载解析规则。这里没有错误,
double& GetValue()
只是比const double& GetValue() const
更好的候选者
The Dreams Wind 说了什么,但编译器不知道你想调用
const double& GetValue() const
(应该是 double GetValue() const
,顺便说一句)因为 ms
没有声明 const
.
虽然有一个简单的解决方法:
void Compute()
{
const Sample &const_ms = ms;
double v = const_ms.GetValue();
}