【问题标题】:Ambiguous call of constructor from overloaded operator function in C++从 C++ 中的重载运算符函数对构造函数的模糊调用
【发布时间】:2016-05-06 01:37:06
【问题描述】:

我正在尝试对具有以下成员和函数的类使用重载运算符:

class MyVector {

  private:
    int           *data;
    unsigned int  vector_size;

  public:
    MyVector();
    MyVector(unsigned int n);
    MyVector(unsigned int size, int *in_array=NULL);
    MyVector(const MyVector& copy);
    ~MyVector();
    void print();

    // Assignment operator.
    MyVector& operator=(const MyVector& v);

    friend MyVector operator*(const int &lhs, MyVector &rhs);

    friend MyVector operator*(MyVector &rhs, int &lhs);

    MyVector operator*(MyVector &vector);
};

// Implementing operator overloading.
MyVector operator*(int &lhs, MyVector &rhs);
MyVector operator*(MyVector &lhs, int &rhs);

在我的一个运算符重载函数中,这是我想要做的:

MyVector operator*(const int &lhs, MyVector &rhs) {

    unsigned int size = rhs.vector_size;

    // Create new vector.
    MyVector *v = new MyVector(static_cast<unsigned int>(size));

    for (unsigned int i = 0; i < rhs.vector_size; i++) {
        v -> data[i] = lhs * rhs.data[i];
    }

    return *v;
}

我收到以下错误:

MyVector_fxns.cpp: In function 'MyVector operator*(const int&, MyVector&)':
MyVector_fxns.cpp:42:60: error: call of overloaded 'MyVector(unsigned int)' is ambiguous
  MyVector *v = new MyVector(static_cast<unsigned int>(size));

在您将此标记为重复之前,我已经检查了this link,但没有一个解决方案适合我。

在三个可能的构造函数中,这里应该只调用 1 个。尽管我在构造函数参数中传递了正确的类型,但导致错误的原因是什么?

【问题讨论】:

  • 该代码泄漏内存。您分配了一个新对象,但您无法在返回给您的指针值上调用 delete。您的 operator * 应该在本地创建一个 MyVector 对象,并按值返回它。摆脱对new 的呼叫,只需MyVector v(static_cast&lt;unsigned int&gt;(size));...return v; 即可。

标签: c++ pointers operator-overloading ambiguous


【解决方案1】:
   MyVector(unsigned int n);
   MyVector(unsigned int size, int *in_array=NULL);

这是模棱两可的。鉴于上述构造函数:

MyVector v(10);

这可以使用这两个构造函数之一,第二个构造函数的第二个参数默认。这就是编译器所抱怨的。编译器不知道要使用哪个构造函数。它可以使用任何一种。它不能自己决定,或者翻转或硬币,或者什么。在编译 C++ 代码时,不能只掷硬币,然后选择构造函数。

错误消息从字面上说明了这一点。这是一个非常明显的编译错误:

重载 'MyVector(unsigned int)' 的调用不明确

你有一个重载的构造函数。而且是模棱两可的。

【讨论】:

  • 如果只有一个参数,为什么还要打扰第二个构造函数?我想,删除 in_array 变量的默认值会修复它,但我只是假设它会自动考虑第一个构造函数,因为只有一个参数。
  • @Objective-J 那么为什么在第二个构造函数中将第二个参数设为可选,如果它应该在没有第二个参数的情况下使用第一个构造函数呢?
  • 因为第二个构造函数也可以用一个参数调用。如果你声明了一个默认参数,但你没有提供它,你仍然可以在没有它的情况下调用函数或构造函数。这就是 C++ 的工作原理。如果您希望所有带有一个参数的构造函数调用都调用第一个构造函数,并且所有带有两个参数的构造函数调用都调用第二个构造函数,那么您必须摆脱“=null”默认值。
  • @Objective-J 错误消息有一个重要用途。如果您打算允许第二个参数为默认值,那么您在定义只有一个参数的构造函数时犯了一个错误。这两个构造函数都没有意义,所以是不允许的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 2013-03-26
相关资源
最近更新 更多