【发布时间】: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