【问题标题】:Overloading operator ^ for integer type整数类型的重载运算符 ^
【发布时间】:2012-05-17 16:28:29
【问题描述】:

我编写了一个应用程序,我经常在其中使用来自math.h 库的pow 函数。我试图重载operator^ 以使求幂更容易和更快。我写了这段代码:

#include <iostream>
#include <math.h>

using namespace std;

int operator^(int, int); // line 6    
int main(int argc, char * argv[]) { /* ... */ }

int operator^(int a, int n)   // line 21
{
  return pow(a,n);
}

编译器(我在 Linux 上使用 g++)返回了这些错误:

main.cpp:6:23: 错误:'int operator^(int, int)' 必须有参数 类或枚举类型 main.cpp:21:27: 错误: ‘int operator^(int, int)' 必须有一个类或枚举类型的参数

【问题讨论】:

  • 正如 codaddict 所说,您不能在内置类型上重载运算符,但即使可以,您也可能不想这样做。 ^ 因为按位异或是左结合的,所以2^3^4 意味着 (2^3)^4 = 4096,而不是更常见的 2^(3^4) ~= 2.4E24。
  • @PhilipC:如果你在谈论权力,那么无论关联性是什么,不带括号的 2^3^4 都是一个坏主意。每个不知道关联性规则的程序员都会怀疑它实际上做了什么。
  • 哦...这是运算符重载的主要规则之一,我忘记了。多么失败:/
  • @KillianDS 没错,但如果你要假设它的意图是什么,你可能会假设错误的方向。

标签: c++ compiler-errors operators operator-overloading


【解决方案1】:

我试图重载 operator^ 以使求幂更容易和更快

你拼错了 confusing,因为它肯定不会更快也不会更容易。如果您这样做,任何维护您的代码的人都会讨厌您。

幸运的是,C++ 要求至少有一个参数是用户定义的类型,所以你不能这样做。

【讨论】:

  • 但即使是用户定义的类型,这也是一个糟糕的选择。 ^ 以相对较低的优先级左关联。对于求幂,它应该是具有极高优先级的右结合。
  • 即使对于用户定义的类型,^ 也会令人困惑,因为它已经定义了不同的语义。对于用户定义的类型,您可以使用**^*(一元* 返回一个定义*^ 表示pow 的助手类),但您仍然会遇到问题Jerry 提出的优先权和约束力。而使用额外的辅助类来解决这些问题意味着括号不能覆盖优先级,这是完全不可接受的。
【解决方案2】:

您不能重载运算符以仅对内置类型进行操作

如编译器错误消息中明确说明的,至少一个参数必须是用户定义的类或枚举类型(或对其中之一的引用)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2015-12-24
    • 1970-01-01
    相关资源
    最近更新 更多