【发布时间】:2021-03-22 10:29:31
【问题描述】:
我有一个类,它有一个要隐藏的int& 的转换运算符。我创建了一个派生类,它只提供到int 的转换,并将转换为int& 私有。但我仍然无法使用int 转换,编译器告诉我转换不明确,或者坚持使用int& 转换并告诉我它无法访问。我该如何完成这项工作?
struct Base {
int value;
operator int&() { return value; }
};
struct Derived : Base {
operator int() { return operator int&(); }
private:
using Base::operator int&;
};
int main() {
int p = Derived();
}
附:编译器使用 gcc 9.3.0,真实情况是从 ROS 包装 XmlRpc::XmlRpcValue 类来处理从 double XmlRpcValue 类型到 int 或 int XmlRpcValue 类型到 double 的可能转换。
【问题讨论】:
-
private不会导致operator int &()的存在被忽略。编译器选择候选者(operator int()和operator int &())并在检查可访问性之前确定哪个是最好的(例如private)。这两个候选者同样可行,因此会检测到歧义。解决方案是删除其中一个运算符。 -
感谢您的评论@Peter。不幸的是,我无权访问 Base 类代码。有什么办法可以在继承类的同时隐藏运算符?谢谢。
-
@Peter:不幸的是,我尝试了一点,但找不到从派生类中删除在基类上声明的运算符的方法。
-
不使用继承,而是将
Base设为private的Derived成员。那么Derived的界面中没有operator int &()除非你指定一个。 -
哦,好吧,那么我想除了编写 Base 类而不是继承它之外,没有其他解决方案。谢谢你们的帮助。 (虽然我不知道这种行为是否是编译器团队有意为之的)
标签: c++ inheritance type-conversion implicit-conversion