繁体   English   中英

gcc的函数重载解析不明确。 为什么?

[英]Ambiguous function overload resolution with gcc. Why?

假设我有以下代码

enum MyEnum {Value1 = -1, Value2, Value3, Value4, Value5};

class OtherClass // Added after solving the problem
{
public:
    OtherClass(int p1 = 0, int p2 = 0, int p3 = 1, int p4 = 0, double p5 = 0);
    OtherClass(const Size<int> p1, const int p2 = 1, const int p3 = 0, const double p4 = 0);
}

class MyBase
{
protected:
    virtual boost::optional<MyEnum> myBadFunc(const OtherClass& o) = 0;
}

class MyClass : MyBase
{
private:
    virtual boost::optional<MyEnum> myBadFunc(const OtherClass& o);
    MyEnum myBadFunc(const unsigned int ui) const;

    void callingFunc(unsigned int value);
}

现在,我试图像这样从callingFunc()内部调用myBadFunc()

void MyClass::callingFunc(unsigned int value)
{
    MyEnum retVar;

    retVar = myBadFunc(value); // Line which causes Warning!
}

在带有评论的行上,我得到警告:

警告:ISO C ++表示这些含义不明确,即使第一个最差的转换比第二个最差的转换要好:[默认启用] retVar = myBadFunc(value);

这很奇怪,因为我不明白为什么重载分辨率不应决定使用myBadFunc()的第二个(非继承)版本。

我知道这段代码看起来有些怪异。 那是因为它是我们公司软件中使用的类的简化版本,并且进行重构需要大量的工作。

我正在将gcc v4.8.5与标志-Wall -Wextra -std=c++11 -fopenmp和boost库v1.58一起使用(以防与boost::optional )。

我的具体问题是:

在这种具体情况下发出此警告的原因是什么,我该如何解决?

看起来我发现了问题。 OtherClass的构造函数存在OtherClass 正如lubgr在他的评论中询问的那样,没有构造函数只接受unsigned int。 但是有两个构造函数采用int形式,后跟多个其他参数。

在再次对该类进行查看之后,我意识到其他参数是可选的,这意味着它们可以隐式地用作转换构造函数。

使它们explicit可修复警告。

class OtherClass
{
public:
    explicit OtherClass(int p1 = 0, int p2 = 0, int p3 = 1, int p4 = 0, double p5 = 0);
    explicit OtherClass(const Size<int> p1, const int p2 = 1, const int p3 = 0, const double p4 = 0);
}

感谢lubgr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM