我正在尝试使用 = 的运算符重载实现模板类 到目前为止它适用于非指针元素,但如果我尝试它用于指针它不会编译
我的模板类:
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 示例只是我尝试实现的代码的简化。)
非常感谢,
最佳答案
错误信息说得好:
error: assigning to 'IBag<QString *> *' from incompatible type 'QString *'
pbag = new QString("Blub");
^ ~~~~~~~~~~~~~~~~~~~
pbag
是指针,不是 IBag
。您为 IBag
重载了 operator =
,而不是为 IBag *
(这是不可能的)。
这应该可以编译,因为它调用了您的运算符:
*pbag = new QString("Blub");
关于C++ Overload Operator = for Pointers 不编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25604548/