我正在尝试实现一个带有运算符重载的模板类= 到目前为止,它适用于非指针元素,但如果我尝试指针它不会编译
我的模板类:
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示例只是我试图实现的代码的简化。)
非常感谢,
答案 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提到了一个带指针的例子,但与去引用(用*)一起使用。