我有一个定义如下的结构:
struct Vec3 {
float x, y, z;
}
当我尝试使用时std::unique
on a std::vector<Vec3>
,我遇到了这个错误:
描述 资源路径 位置类型
“_”中的“运算符==”不匹配first._gnu_cxx::__normal_iterator<_iterator _container>::operator* 与 _Iterator = Vec3*, _Container = std::vector > == _next._gnu_cxx::__normal_iterator<_iterator _container>::operator* with _Iterator = Vec3*, _Container = std::vector >' ModelConverter 第 4351 行,外部位置:/usr/include/c++/4.4.6/bits/stl_algo.h C/C++问题
我理解编译器在不等式运算符和其他运算符中naievite的必要性(在这种情况下,*几乎肯定不是我的意思),但这是一个政策问题,还是有我不知道的技术原因吗?有一个默认的赋值运算符,那么为什么没有默认的相等运算符呢?
没有技术原因。迂腐地,您可能会说这是因为 C 不允许您比较两个结构==
,这是一个很好的理由;当您转向 C++ 时,行为切换并不明显。 (大概,C 不支持这一点的原因是字段明智的比较可能适用于some结构,但绝对不是全部。)
仅从 C++ 的角度来看,如果您有一个私有字段怎么办?默认的==
从技术上讲,暴露了该领域(间接,但仍然)。那么编译器只会生成一个operator==
如果没有私有或受保护的数据成员?
此外,有些类没有合理的相等性定义(空类、不对状态建模但缓存它的类等),或者默认的相等性检查可能非常令人困惑(包装指针的类)。
然后是继承。决定做什么operator==
在继承比较复杂的情况下,编译器很容易做出错误的决定。 (例如,如果这是 C++ 所做的,我们可能会问为什么==
当您测试两个对象之间的相等性时总是会成功,这两个对象都是抽象基类的后代并与其引用一起使用。)
基本上,这是一个棘手的问题,即使考虑到您可以覆盖编译器决定的任何内容,编译器也不介入它会更安全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)