C++ 整数类型的重载运算符^
我编写了一个应用程序,其中我经常使用C++ 整数类型的重载运算符^,c++,compiler-errors,operators,operator-overloading,C++,Compiler Errors,Operators,Operator Overloading,我编写了一个应用程序,其中我经常使用math.h库中的pow函数。我试图重载操作符^,使求幂更容易、更快。我写了这段代码: #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)
math.h
库中的pow
函数。我试图重载操作符^
,使求幂更容易、更快。我写了这段代码:
#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);
}
#包括
#包括
使用名称空间std;
int运算符^(int,int);//第6行
int main(int argc,char*argv[]){/*…*/}
int运算符^(int a,int n)//第21行
{
返回功率(a,n);
}
编译器(我在Linux上使用了g++)返回了以下错误:
main.cpp:6:23:错误:“int运算符^(int,int)”必须有参数
类或枚举类型main.cpp:21:27:错误:“int运算符^(int,
int)“”必须具有类或枚举类型的参数
不能重载运算符,使其仅对内置类型进行操作 至少有一个参数必须是编译器错误消息中明确说明的用户定义类或枚举类型(或对其中一个的引用) 我试图重载操作符^,使求幂更容易更快 你拼错了使人困惑,因为它肯定既不快也不容易如果您这样做,维护代码的任何人都会讨厌您
<>幸运的是,C++至少需要一个参数是用户定义的类型,所以你不能这样做。正如CODAdvt所说,你不能在内置类型上重载运算符,但是即使你可以,你也可能不想这样做。因为按位异或是左联想的,所以
2^3^4
意味着(2^3)^4=4096,而不是更常见的2^(3^4)~=2.4E24。@PhilipC:如果你说的是幂,写2^3^4
不带括号是个坏主意,不管关联性是什么。每一个不知道联想性规则的程序员都会怀疑它到底在做什么。。。这是运算符重载的主要规则之一,我忘记了。真是个失败:/@KillianDS是真的,但是如果你想对它的意图做出一个假设,你可能会朝着错误的方向假设。但是即使是对于用户定义的类型,这也是一个糟糕的选择<代码>^左关联,优先级相对较低。对于求幂运算,它应该是右关联的,具有极高的优先级。即使对于用户定义的类型,^
也会令人困惑,因为它已经有了不同的定义语义。对于用户定义的类型,您可以使用**
或^*
(使用一元*
返回一个helper类,该类定义了*
或^
表示pow
),但仍然存在Jerry提出的优先级和绑定问题。使用额外的帮助器类来解决这些问题意味着括号不能覆盖优先级,这是完全不可接受的。