C++指针的重载运算符 = 不编译
C++ Overload Operator = for Pointers does not compile
我正在尝试实现一个带有运算符重载的模板类 =到目前为止,它适用于非指针元素,但是如果我尝试用于指针,它将无法编译
我的模板类:
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++指针的重载运算符 = 无法正常工作/编译
- C++中的条件运算符 ( ? : ) 可以编译时吗?
- 编译"运算符删除"时C++编译器如何工作?
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 使用 MINGW gcc 编译时,不会为 std::string 调用重载的新运算符
- 编译我的 3 个文件时,我收到错误,说"运算符="不匹配
- 使用堆栈编译错误的 C++ 反向行没有运算符匹配操作数
- 代码块编译错误与运算符<<不匹配
- ostream 运算符的编译时重载
- 编译Qt项目给出了对运算符delete(void*,unsigned int)的未定义引用
- <<运算符覆盖使用 g++ 而不是窗口编译
- 为什么有条件编译运算符模板会更改另一个运算符的可用性?
- 在 sizeof 运算符上强制编译时错误
- 如何在C++编译时检查运算符的特定重载是否存在
- 为模板类编写二进制加法运算符. 编译错误
- 重载运算符编译错误?
- C++:std::endl 和运算符的编译错误>>
- 隐式用户定义的转换不起作用,因为在编译C 时无法识别运算符和转换构造函数
- 为什么不提升元组运算符 == 并<<编译?
- 奇怪的语法构造 - 应用于 typedef 的运算符 () 使用 VS2015 成功编译
- BOOST_CHECK无法编译运算符<<用于自定义类型