如何使此操作员调用明确无误
How to make this operator call unambiguous?
我正在写一个智能指针作为我的学校作业,但我遇到了一个问题。需要在我的智能指针和原始指针之间进行转换,所以我在智能指针类中使用运算符重载来实现它,如下所示:
operator T*() {
return raw_pointer;
}
另一个要求是实现==运算符,它应该在智能指针之间以及智能指针和原始指针之间工作。我已经这样实现了它,这种重载也可以在我的智能指针类中找到:
bool operator== (const smart_pointer<T> &smart_pointer) {
return raw_pointer == smart_pointer.raw_pointer;
}
现在,当我尝试做这样的事情时:
smart_pointer<obj> sp = new obj();
obj *p = new obj();
if(sp == p) {
// do something
else {
// do something else
}
我收到以下错误消息:
ambiguous overload for 'operator=='
candidates are:
operator==(obj*, obj*) <built-in>
bool smart_pointer<T>::operator==(const smart_pointer<T>&) [with T = obj]
我想它不知道是应该使用内置指针并将我的智能指针转换为原始指针,还是应该使用重载==运算符的方法。问题是,我目前想不出任何办法来解决这种情况。提前感谢!
原始指针和智能指针之间的隐式转换有点危险,这就是为什么标准智能指针不提供它们的原因。如果你根本没有它们,那就太好了。
也就是说,这可能不是你的选择。实际问题的解决方案是简单地添加更多equals运算符的重载,以便在智能指针和原始指针之间进行混合比较。然后,那些将优先于那些需要在任何一个方向上转换的人。
为每个可能的参数类型组合创建比较运算符等的重载是不现实的。
转换为原始指针explicit
本身可能是一件好事,但并不能解决这个问题。模糊性将得到解决,从而编译代码,但代价是为原始指针创建一个临时智能指针。在完整表达式的末尾,智能指针的析构函数将销毁糟糕的原始指针的引用。
因此,一般的解决方案是使每个单参数构造函数explicit
,或者添加(非默认)形式参数。
设置构造函数或转换explicit
应该可以解决歧义:
explicit smart_pointer(T*);
或
explicit operator T*() const {
return raw_pointer;
}
创建多个重载是另一种选择/补充。
正如注释中所指出的,您不希望构造函数对于指针的过早破坏是隐式的。
转换最好也是显式的,然后为上的不同组合添加重载
相关文章:
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 为什么必须动态分配扩展数组才能使此功能正常工作C++
- 为什么在同一条件变量上使用多个互斥锁会使此代码崩溃?
- 如何使此函数适用于 100 个对象 (c++)?
- 如何使此函数使用 getline 读取字符串并使用 int 执行相同的行为?
- 如何使此 DLL 头文件更可重用
- 从2011年开始,必须在2019年开始工作以使此Windows Textbox做出哪些更改
- 使此功能更"elegant" C++
- 是否有一种方法可以使此C 14递归模板在C 17中短
- 如何使此功能与 FILE 一起使用?C++
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具
- 使此 C++ 代码通用
- 如何在C 中使此初始化合法
- 如何使用 openMP 使此代码线程安全
- 如何使此链接列表正常工作
- 如何使此模板类编译
- 如何使此C 程序更强大
- 需要一种方法来使此代码运行得更快
- 为什么调用基类析构函数会使此程序崩溃
- 如何使此操作员调用明确无误