【问题标题】:Implicit conversion insists on using private function隐式转换坚持使用私有函数
【发布时间】: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 设为privateDerived 成员。那么Derived的界面中没有operator int &()除非你指定一个。
  • 哦,好吧,那么我想除了编写 Base 类而不是继承它之外,没有其他解决方案。谢谢你们的帮助。 (虽然我不知道这种行为是否是编译器团队有意为之的)

标签: c++ inheritance type-conversion implicit-conversion


【解决方案1】:

我找不到通过继承的方法。但是如果 containment 是一个选项(Derived has a Base 而不是 is a),那就简单多了:

struct Base {
    int value;
    operator int&() { return value; }
};

struct Derived{
    Base b;
    operator int() { return b.operator int&(); }

};

int main() {
    int p = Derived();
}

主要缺点是您必须对要在 Derived 中提供的方法/成员使用显式委托

【讨论】:

  • 是的,我目前的解决方案是这样的,但是我要包装的基类包含许多函数,所以我非常想避免你在回答中所说的缺点。无论如何,非常感谢您的回答,Serge!
  • @BimoAdityarahman:也许你可以暂时不接受我的回答,看看其他人是否能找到 the 诀窍。当我们进入它的极端情况时,C++ 是一种非常复杂的语言。我擅长使用 C++ 进行真实世界编程,但我不会假装自己是该语言复杂性方面的专家...
猜你喜欢
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2020-05-11
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多