使用gcc进行模糊函数重载决策。为什么?

时间:2018-06-14 09:52:56

标签: c++ gcc boost gcc-warning

我们说我有以下代码

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);
}

现在我试图从myBadFunc()内部拨打callingFunc(),如下所示:

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

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

在评论栏中我收到警告:

  

警告:ISO C ++表示这些是模棱两可的,即使第一个的最差转换优于第二个的最差转换:[默认启用]      retVar = myBadFunc(value);

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

我知道这段代码看起来有些奇怪。这是因为它是我们公司软件中使用的类的简化版本,并且重构它将会有很多工作。

我使用带有标记-Wall -Wextra -std=c++11 -fopenmp的gcc v4.8.5和boost库v1.58(如果它与boost::optional有关)。

我的具体问题是:

在这个具体案例中出现此警告的原因是什么?如何解决?

1 个答案:

答案 0 :(得分:0)

看起来我发现了问题。 这是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