C++ 隐式转换坚持使用私有函数

C++ 隐式转换坚持使用私有函数,c++,inheritance,type-conversion,implicit-conversion,C++,Inheritance,Type Conversion,Implicit Conversion,我有一个类,它有一个要隐藏的到int&的转换运算符。我创建了一个派生类,它只提供到int的转换,并将转换为int&private。但是我仍然无法使用int转换,要么编译器告诉我转换不明确,要么坚持使用int&转换并告诉我转换不可访问。我该怎么做 struct Base { int value; operator int&() { return value; } }; struct Derived : Base { operator int() { return

我有一个类,它有一个要隐藏的到
int&
的转换运算符。我创建了一个派生类,它只提供到
int
的转换,并将转换为
int&
private。但是我仍然无法使用
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,实际情况是从包装XmlRpc::XmlRpcValue类来处理可能从double XmlRpcValue类型到int或int XmlRpcValue类型到double的转换。

我找不到通过继承的方法。但是如果包含是一个选项(
派生的
有一个
,而不是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();
}

主要缺点是,您必须对要在
派生的

私有的
中提供的方法/成员使用显式委托,这不会导致忽略
运算符int&(()
的存在。编译器选择候选对象(
operator int()
operator int&()
),并在检查可访问性(例如
private
)之前确定哪一个最好。这两个候选者同样可行,因此会检测到歧义。解决方案是删除其中一个操作员。感谢您的评论@Peter。不幸的是,我没有访问基类代码的权限。有没有办法在继承类的同时隐藏操作符?谢谢。@Peter:不幸的是,我尝试了一点,但找不到从派生类中删除基类上声明的运算符的方法。与其使用继承,不如将
base
a
private
作为
derived
的成员。那么在
Derived
的接口中就没有
操作符int&(
),除非您指定一个。哦,好吧,那么我想除了组合基类而不是继承它之外,没有其他解决方案了。谢谢你们的帮助。(虽然我不知道这种行为是否是编译器团队故意的和有意的)是的,我当前的解决方案是这样的,但是我想要包装的基类包含许多函数,所以我非常希望避免您在回答中提到的缺点。无论如何,非常感谢你的回答,Serge@也许你可以暂时不接受我的回答,看看别人是否能找到窍门。C++是一个非常复杂的语言,当我们进入它的角落的情况下。我擅长C++的真实世界编程,但我不假装是语言复杂的专家…当然,谢谢你的帮助!