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

C++ Overload Operator = for Pointers does not compile

本文关键字:编译 运算符 重载 指针 C++      更新时间:2023-10-16

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

我的模板类:

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 = 新 IBag(( 将分配 IBag,但 x = 新 QString("sdjf"(;将转发到我的自定义重载,因为它是一个不同的对象(

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

多谢

错误消息说得很好:

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

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

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

*pbag = new QString("Blub");

好吧

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 的自定义构造函数。

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

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

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++指针的重载运算符 = 无法正常工作/编译