2012-05-09 21 views
3

私はしばしばpow関数をmath.hライブラリから使用するアプリケーションを作成しました。私は累乗をより簡単かつ迅速にするために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: error: ‘int operator^(int, int)’ must have an argument of class or enumerated type main.cpp:21:27: error: ‘int operator^(int, int)’ must have an argument of class or enumerated type

+0

codaddictによれば、組み込み型で演算子をオーバーロードすることはできませんが、できる場合でもそうしたくないかもしれません。 ^はビットアトリビュートxorが左結合型であるため、通常の2 ^(3^4)〜= 2.4E24ではなく、(2^3)^ 4 = 4096を意味します。 –

+0

@PhilipC:あなたが力について話しているなら、括弧を付けずに '2^3^4'と書くことは、連想性が何であれ、悪い考えです。連想性の規則を心に気づかないすべてのコーダーは、実際に何をするのか疑問に思うでしょう。 – KillianDS

+0

ああ...これは演算子のオーバーロードの主なルールの1つで、私はそれを忘れてしまった。何が失敗するのですか:/ –

答えて

9

あなたが唯一の組み込み型にを操作するオペレータをオーバーロードすることはできません。

少なくとも1つの引数は、コンパイラのエラーメッセージに明示されているように、ユーザー定義のクラスまたは列挙型(またはそれらのいずれかへの参照)でなければなりません。

+0

Thx、それは私がそれを忘れていたので、愚かだった... –

6

I tried to overload operator^ to make exponentiation easier and faster

それは確かに速くも簡単にではありませんので、あなたは、を混乱をスペルミス。 誰でもあなたのコードを維持することは、あなたがこれをした場合あなたを憎むでしょう。

幸いにも、C++では少なくとも1つのパラメータがユーザ定義の型である必要があるため、これを行うことはできません。

+2

しかし、ユーザー定義型の場合でも、それは貧しい選択です。 '^'は相対的に優先順位が低く関連付けられています。べき乗のためには、それは非常に高い優先順位で右結合でなければならない。 –

+2

ユーザ定義型であっても、すでに定義されているセマンティクスが異なるため、 '^'は混乱します。ユーザ定義型の場合、 '**'や '^ *'(単項 '*'を使って '*'や '^'を定義したヘルパークラスを返して '' pow'を意味する)を使うことができます。 Jerryによって提起された優先権と拘束の問題。追加のヘルパークラスを使ってそれらを解決すると、カッコで優先順位を上書きすることができなくなります。これは全く受け入れられません。 –

関連する問題