运算符重载是编程语言的一个特性,它允许运算符的自定义实现,具体取决于所涉及的操作数的类型。有些语言允许定义新的运算符,而其他语言只允许重新定义现有的运算符。
有人可以帮我找出我的 = 运算符出了什么问题吗?如果没有这两个函数,我的程序可以完美运行,但是一旦实现它们,就会导致错误并带有退出代码......
#包括 使用命名空间 std; 结构坐标{ 整数x; 整数y; 布尔运算符 == (const coord &c1) { 返回 (x == c1.x && y == c1.y); } }; int main() { 坐标 xy1 ...
我有一个简单的类,其中包含游戏的基本技能属性。每个玩家都有这个技能类别。我希望能够进行基本算术,例如玩家技能 = 玩家技能 + 2, ...
我有一个任务类,其中有一个字符串文本私有成员。我通过 const string getText() const; 访问该变量。 我想重载 == 运算符来检查 ob 的不同实例...
我编写的代码有 4 个类。 SpecialCharacter 类有 2 个基类:Hero 和 Enemy,它们都以 Person 作为基类。 #包括 类人{ 私人的: ch...
使用 [1,2,3] 访问运算符[]会导致调用运算符[](int)...这是一个错误吗?
我试图通过运算符[]访问一个类似于多维数组的类..却发现逗号分隔的参数集被简化为仅第一个参数..T...
我目前正在努力对重载运算符进行概念检查。 我设法检查“正常” <=> 运算符,但我无法检查 <=> 运算符
在Dart中,我可以重写toString方法来更改对象用作字符串时返回的字符串内容。 当对象用作双精度对象时,我需要更改该对象的行为。 我愿意
我阅读了 cppreference 页面中的运算符重载 - “二元算术运算符”。我对一段代码中的注释感到困惑,它鼓励按值传递,而不是引用......
为什么要在类外部定义运算符 + 或 +=,以及如何正确执行?
我对之间的差异有点困惑 类型运算符 + (const Type &type); 类型 &operator += (const Type &type); 和 friend 类型运算符 + (const Type &type1, const
我正在阅读 Bjarne Stroustrups 使用 C++ 的原理和实践。在关于运算符重载的第 9.6 章中,他给出了以下示例: 枚举类 Month { 一月=1、二月、三月、四月、五月、六月、J...
错误:与“运算符<<' (operand types are 'QTextStream' and 'const char [3]')
这是一段基于 Qt 的代码,已经有一年了,我可能在各种上下文中编译过很多很多次,而且每次我都不知道。它位于一个名为 DPolygo 的文件中...
为什么这个运算符重载可以在 MSVC 和 GCC 中编译,但不能在 Clang 中编译?
我正在尝试创建一个strong_alias包装类型,它可以与原始类型互换,但不能与其他strong_alias互换。 #包括 #包括 模板 我正在尝试创建一个 strong_alias 包装类型,它可以与原始类型互换,但不能与其他 strong_aliases 互换。 #include <array> #include <stdint.h> template <typename T, typename tag> requires std::is_arithmetic<T>::value class strong_alias { public: using type = T; constexpr strong_alias() : _value{} { } template <typename other> requires std::is_arithmetic<other>::value constexpr strong_alias(const other &set_value) : _value{T(set_value)} { } constexpr T &value() { return _value; } constexpr const T &value() const { return _value; } template <typename other> requires std::is_arithmetic<other>::value constexpr operator other() const { return other(value()); } constexpr bool operator==(const strong_alias &rhs) const { return value() == rhs.value(); } constexpr strong_alias operator*(const strong_alias &rhs) const { return value() * rhs.value(); } private: T _value; }; using A = strong_alias<int8_t, struct A_tag>; static_assert(std::is_assignable<A, A>()); static_assert(std::is_assignable<A, int>()); static_assert(std::is_assignable<int &, A>()); using B = strong_alias<int8_t, struct B_tag>; static_assert(not std::is_assignable<A, B>()); static_assert(not std::is_assignable<B, A>()); static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang int main() { } 上面的代码可以使用 MSVC (/std:c++latest) 和 GCC (-std=c++2c) 进行编译,但不能使用 Clang (-std=c++2c) 进行编译。 这里有编译器资源管理器演示。 哪些编译器能够正确处理这段代码?在 Clang 下使其工作的首选方法是什么? Compiler Explorer 的 Clang 输出: <source>:61:29: error: use of overloaded operator '*' is ambiguous (with operand types 'A' (aka 'strong_alias<signed char, A_tag>') and 'int') 61 | static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang | ~~~~ ^ ~~ <source>:43:25: note: candidate function 43 | constexpr strong_alias operator*(const strong_alias &rhs) const | ^ <source>:61:29: note: built-in candidate operator*(float, int) 61 | static_assert(A(-3) == A(3) * -1); // builds with MSVC and GCC but not Clang | ^ <source>:61:29: note: built-in candidate operator*(double, int) <source>:61:29: note: built-in candidate operator*(long double, int) <source>:61:29: note: built-in candidate operator*(int, int) [...many lines omitted...] <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned long) <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned long long) <source>:61:29: note: built-in candidate operator*(unsigned long long, unsigned __int128) 1 error generated. Compiler returned: 1 首先,我们应该在重现问题的同时尽可能地简化代码。令人失望的是,OP 似乎没有做出任何尝试这样做。这是最小化版本: #include <type_traits> struct A { A(int set_value) : _value{set_value} { } template <typename other> requires std::is_arithmetic<other>::value operator other() const { return other(_value); } A operator*(const A &rhs) const { return _value * rhs._value; } int _value = 0; }; int main() { (void)(A(3) * -1); } 现在,这个*可以有几种不同的解释方式。它可以是 A::operator*,可通过第二个操作数从 int 到 A 的隐式转换来调用,也可以是内置算术 operator*,可通过第一个操作数的隐式转换来调用操作数从 A 到算术类型(可能第二个操作数也经历到不同算术类型的隐式转换)。 Clang 可以帮助打印出所有候选人。 之所以不明确,是因为当调用operator*时,我们得到了与第一个参数类型的精确匹配以及与第二个参数类型的用户定义转换。当调用内置的 operator*(int, int) 时,我们得到一个用户定义的转换,其第一个参数类型与第二个参数类型完全匹配。所以这两个候选人都不比另一个更好。 叮当是正确的。至于如何编译原始代码,由于问题是由两个候选代码引起的,每个候选代码都可以通过不同的隐式转换实现,因此您的选择基本上是: 提供比所有当前现有候选更好的您自己的重载,例如,一个 operator*,其第一个参数类型为 const strong_alias&,第二个参数类型为算术类型,或者 将 A 的转换构造函数更改为显式,或者 将转换函数 (A::operator other) 更改为显式,或者 以上任意组合 我无法告诉您哪个选项最适合您。这取决于您希望您的类型提供的 API。 GCC 和 MSVC 之所以不认为它含糊不清,可能与他们使用不同的算法来确定哪些内置运算符是候选者有关。在这种特殊情况下,他们只是给出了错误的答案,但更普遍的是,该标准没有就如何在其他可能涉及无限的初始候选者的情况下缩小一组相关内置候选者的范围提供足够的指导。请参阅CWG2844。
按照此答案中给出的建议,我在简单的 Point 类中重载了 + 运算符,如下所示( += 重载工作正常)。 点运算符+ (Point p1, const Point& p2) { ...
我的 C++ 代码中遇到错误,我正在寻求解决该错误的帮助。当尝试使用 << operator with std::cout to output the result of a function call, I receive the
我正在看这篇文章 C++ unordered_map 使用自定义类类型作为键 我知道我们需要为自定义类型键重新定义相等性和哈希码。 我知道运营商如何过度...
我经常看到关于在 C++ 中重载逗号运算符的问题(主要与重载本身无关,但类似于序列点的概念),这让我想知道:...
std::ostream 运算符的 C++ 问题<< in template class
如果我将类代码放在同一个头文件或同一个 .cpp 文件中,我就不会遇到这个问题,但是当我将类规范放在头文件中并将类代码放在单独的 .cpp 文件中时,我得到了这个
之前问过operator=重载错误,问题因重复而被关闭,试图修复代码,却出现了新的错误。 const 限定后旧错误消失了, 但是一个新的
是否可以重载 PostgreSQL 中现有的相等运算符,以给出两个 int 或 real 类型值之间的相等性的新定义?我认为这违反了超载规则...