【发布时间】:2021-11-12 09:43:59
【问题描述】:
我想有一种方法来比较使用通用数组引用类型的数组内部表示的不同数据类型(例如字符串和字符向量)。考虑以下代码:
template <typename T>
struct ArrayConstRef {
const T *data;
size_t length;
};
template <typename T>
bool operator==(ArrayConstRef<T> a, ArrayConstRef<T> b);
template <typename T>
class ContainerA {
public:
operator ArrayConstRef<T>() const;
explicit operator const T *() const;
};
template <typename T>
class ContainerB {
public:
operator ArrayConstRef<T>() const;
explicit operator const T *() const;
};
int main() {
if (ContainerA<int>() == ContainerB<int>()) // error - no matching operator==
printf("equals\n");
return 0;
}
即使隐式转换可用,重载的operator== 也不匹配。有趣的是,如果我删除了 explicit 关键字,编译器会设法将两个对象都转换为指针并以这种方式进行比较(我不希望这样做)。为什么一种隐式转换有效,而另一种无效?有没有办法让它工作?
【问题讨论】:
-
这是完整的代码吗?
-
上面的代码实在看不懂。
operator ArrayConstRef<T>() const;应该做什么? -
@kiner_shah:这是一个convertion/cast operator。
-
@Jarod42,谢谢,我明白了 :-)
标签: c++ templates operator-overloading implicit-conversion