【问题标题】:C++ Overload Operator = for Pointers does not compileC++ 重载运算符 = 指针无法编译
【发布时间】:2014-09-01 11:11:51
【问题描述】:

我正在尝试为 = 实现一个带有运算符重载的模板类 到目前为止它适用于非指针元素,但如果我尝试将它用于指针它不会编译

我的模板类:

template <class T>
class IBag {
public:
    T _val;
    void Set(T val) { _val = val; } 
    T Get() { return _val; }

    IBag& operator=(T val) {
        this->Set(val);
        return *this;
    }

    operator T() {
        return this->Get();
    }
};

如何使用它:

class IBagExample
{
    static void showExample() {
        IBag<QString>* bag = new IBag<QString>();
        bag->Set(QString("Blub"));
        *bag = QString("Blub");
    }
};

如何编译:

class IBagExample
{
    static void showExample() {
        IBag<QString*>* pbag = new IBag<QString*>();
        pbag->Set(new QString("Blub")); // This works
        pbag = new QString("Blub"); // This doesn't works ?!?
    }
};

我得到的编译器错误是:

error: assigning to 'IBag<QString *> *' from incompatible type 'QString *'
    pbag = new QString("Blub");
         ^ ~~~~~~~~~~~~~~~~~~~

所以我的问题是如何完成这项工作,我希望 = 运算符的重载将强制 c++ 将所有请求(包括新请求)传递给我的自定义函数,如果它不是当前类的新构造函数(所以IBag* x = new IBag() 将分配 IBag 但 x = new QString("sdjf"); 将被转发到我的自定义重载,因为它是一个不同的对象)

(注意:IBag 示例只是我尝试实现的代码的简化。)

非常感谢,

【问题讨论】:

  • 指针赋值不能“重载”,它已经定义好了。 T *ptr; ptr = foo; 使ptr 具有foo 的值,它不调用任何函数。
  • 您的问题似乎有几个不同的问题。 T foo = bar; 不是赋值调用,它是带有初始化程序的声明。它也不是指针赋值。您的部分“我想做的这一切的结果......”与您说它不起作用的问题的前面部分无关。你能重写你的问题来明确你想要做什么吗?
  • 尝试*pbag = new QString("Blub"); 你不能为指针类型重载operator=(),所以你必须取消对value type的引用
  • @Matt McNabbSo 没有机会这样做或类似的事情吗?也许第二个新的运营商也许 IBag pbag = newVal QString("Blub"); (就像我在 Objective C 中想的那样)?

标签: c++ pointers operator-overloading


【解决方案1】:

错误信息说得很好:

error: assigning to 'IBag<QString *> *' from incompatible type 'QString *'
    pbag = new QString("Blub");
         ^ ~~~~~~~~~~~~~~~~~~~

pbag 是一个指针,而不是 IBag。您为IBag 重载了operator =,而不是IBag *(这是不可能的)。

这应该可以编译,因为它调用了你的操作符:

*pbag = new QString("Blub");

【讨论】:

  • 查看我自己的答案,因为我必须查看我需要的内容
【解决方案2】:

pbag = new QString("Blub"); // This doesn't works ?!?

试试

*pbag = new QString("Blub");

因为pbag 属于IBag* 类型,而不属于IBag 类型。 您实际上是在调用 IBag* 的赋值运算符,我猜它是内置的,但可能“看起来”像

Ibag*& operator=(Ibag* const &);

这不是你的IBag&amp; operator=(T val);,因为它是IBag 的一部分而不是IBag*

您不能更改 C++ 指针类型,并且operator= 必须是指定类型的成员函数。

IBag<QString> bag = QString("Blub");
IBag<QString*> pbag = new QString("Blub");

不工作,因为您没有来自 T 的自定义构造函数。

【讨论】:

  • *pbag 我已经知道并且是我不想要的,这意味着我必须更改已经存在的代码
  • @aqm 你可能是对的。您不能为指针类型定义自定义赋值运算符,但问题 cmets 已经说明得很好。
  • 查看我自己的答案,因为我必须查看我需要的内容
【解决方案3】:

您为一个对象使用的类重载运算符。这里 pBag 只是一个指针而不是一个对象。 C++ 标准 ISO/IEC 14882 § 13.5.3 提到了一个采用指针的示例,但与取消引用一起使用(通过 *)。

【讨论】:

  • 查看我自己的答案,因为我必须查看我需要的内容
【解决方案4】:

根据您的建议对我的代码进行各种更改并查看我需要的内容后,我有以下结果:

class IBagExample
{
   void showExample() {
        IBag<QString*> pbag;
        pbag = new QString("Blub"); // This works !
    }
};

这确实可以编译和工作,但是下面是什么不起作用,我将在另一个后续问题中问这个问题:

class IBagExample
{
   void showExample() {
        IBag<QString*> pbag = new QString("Blub"); // This doesn't work !
    }
};

非常感谢您的帮助!

跟进问题:C++ Overload Operator = for Pointers does not work/compile properly

【讨论】:

  • "Asche auf mein Haupt" - 正如您将在后续部分中看到的那样,我只需要(一杯咖啡和)将 T* 构造函数添加到 Ibag,因为运算符定义不是用于构造.
猜你喜欢
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 2020-10-14
  • 2014-12-24
相关资源
最近更新 更多