C ++重载运算符=指针不能编译

时间:2014-09-01 11:11:52

标签: c++ pointers operator-overloading

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

我的模板类:

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示例只是我试图实现的代码的简化。)

非常感谢,

4 个答案:

答案 0 :(得分:3)

错误消息说得很好:

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

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

这应该编译,因为它会调用您的运算符:

*pbag = new QString("Blub");

答案 1 :(得分:2)

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

*pbag = new QString("Blub");

由于pbag的类型为IBag*,且类型为IBag。 你实际上是调用IBag*的赋值运算符,我猜这是内置的,但可能“看起来像”

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

这不是您的IBag& operator=(T val);,因为该IBag属于IBag*

您无法更改C ++指针类型,operator=必须是指定类型的成员函数。

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您为一个对象使用的类重载运算符。这里pBag只是​​一个指针,而不是一个对象。 C ++标准ISO / IEC14882§13.5.3提到了一个带指针的例子,但与去引用(用*)一起使用。