如何使这个操作员调用明确?
How to make this operator call unambiguous?
我正在写一个智能指针作为我的学校作业,我 运行 遇到了一个问题。需要在我的智能指针和原始指针之间进行转换,所以我通过将运算符重载到我的智能指针 class 中来实现它,如下所示:
operator T*() {
return raw_pointer;
}
另一个要求是实现 == 运算符,它应该在智能指针之间以及智能指针和原始指针之间工作。
我是这样实现的,这个重载也可以在我的智能指针中找到 class:
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]
我猜它不知道是应该使用内置的并将我的智能指针转换为原始指针,还是应该使用重载 == 运算符的我的方法。问题是我目前想不出任何办法来解决这种情况。提前致谢!
原始指针和智能指针之间的隐式转换有点危险,这就是标准智能指针不提供它们的原因。如果您根本没有它们,那将是最好的。
也就是说,这可能不是您的选择。您的实际问题的解决方案是简单地添加更多等于运算符的重载,以便在智能指针和原始指针之间进行混合比较。那些将比那些需要双向转换的人更受欢迎。
设置构造函数或转换 explicit
应该可以解决歧义:
explicit smart_pointer(T*);
或
explicit operator T*() const {
return raw_pointer;
}
创建多个重载是另一个 alternative/complement。
正如评论中所指出的,您不希望构造函数隐式用于过早销毁指针。
最好转换也是显式的,然后为不同的组合添加重载
为每种可能的参数类型组合创建比较运算符等的重载是不切实际的。
转换为原始指针 explicit
本身可能是一件好事,但并不能解决这个问题。歧义将得到解决,以便编译代码,但代价是为原始指针创建一个临时智能指针。在完整表达式的末尾,智能指针的析构函数将破坏可怜的原始指针的指示对象。
所以一般的解决方案是使每个单参数构造函数 explicit
,或者添加(非默认)形式参数。
我正在写一个智能指针作为我的学校作业,我 运行 遇到了一个问题。需要在我的智能指针和原始指针之间进行转换,所以我通过将运算符重载到我的智能指针 class 中来实现它,如下所示:
operator T*() {
return raw_pointer;
}
另一个要求是实现 == 运算符,它应该在智能指针之间以及智能指针和原始指针之间工作。 我是这样实现的,这个重载也可以在我的智能指针中找到 class:
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]
我猜它不知道是应该使用内置的并将我的智能指针转换为原始指针,还是应该使用重载 == 运算符的我的方法。问题是我目前想不出任何办法来解决这种情况。提前致谢!
原始指针和智能指针之间的隐式转换有点危险,这就是标准智能指针不提供它们的原因。如果您根本没有它们,那将是最好的。
也就是说,这可能不是您的选择。您的实际问题的解决方案是简单地添加更多等于运算符的重载,以便在智能指针和原始指针之间进行混合比较。那些将比那些需要双向转换的人更受欢迎。
设置构造函数或转换 explicit
应该可以解决歧义:
explicit smart_pointer(T*);
或
explicit operator T*() const {
return raw_pointer;
}
创建多个重载是另一个 alternative/complement。
正如评论中所指出的,您不希望构造函数隐式用于过早销毁指针。
最好转换也是显式的,然后为不同的组合添加重载
为每种可能的参数类型组合创建比较运算符等的重载是不切实际的。
转换为原始指针 explicit
本身可能是一件好事,但并不能解决这个问题。歧义将得到解决,以便编译代码,但代价是为原始指针创建一个临时智能指针。在完整表达式的末尾,智能指针的析构函数将破坏可怜的原始指针的指示对象。
所以一般的解决方案是使每个单参数构造函数 explicit
,或者添加(非默认)形式参数。