問題タブ [operator-keyword]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
7 に答える
1731 参照

c++ - C ++でオーバーロードされた算術演算子の最良のシグネチャは何ですか?

オーバーロードされた operator+= メンバー関数の存在を前提として、operator+ の標準的な形式は次のようになると想定していました。

しかし、これも機能することが指摘されました。

本質的に、このフォームは一時オブジェクトの作成を実装の本体から関数呼び出しに転送します。

2 つのパラメーターの型が異なるのは少しぎこちなく思えますが、2 番目の形式に問題はありますか? どちらかを優先する理由はありますか?

0 投票する
3 に答える
2199 参照

c++ - C++演算子のあいまいさ

私はC++にかなり慣れていないので、許してください。しかし、演算子のあいまいさに関して問題があります。デスクトップでコンパイルされたコードについては、コンパイラ固有だと思います。しかし、私のラップトップではコンパイルできません。何が悪いのかはわかっていると思いますが、それを回避するためのエレガントな方法はわかりません。明らかな間違いがある場合はお知らせください。とにかく、これが私がやろうとしていることです:

私はVector4と呼ばれる独自のベクトルクラスを作成しました。これは次のようになります。

次に、問題を引き起こしているこれらの演算子があります。

Vector4クラスのインスタンスをglVertex3fvに渡すことができるように、変換演算子があります。明らかな理由で添え字を付けています。ただし、Vector4の添え字を含む呼び出しは、コンパイラーにとってあいまいになります。

候補者は次のとおりです。

添え字演算子が既にVector4で定義されているのに、なぜ最初にVector4をGLfloat*に変換しようとするのでしょうか。型キャストを伴わない、これを回避する簡単な方法はありますか?私はばかげた間違いをしているだけですか?よろしくお願いします。

0 投票する
8 に答える
3230 参照

c++ - C++ コンパイラが関数を見つけられません (名前空間関連)

私は Visual Studio 2008 で C++ プログラミングの課題に取り組んでいます。次の名前空間階層を定義するファイルが提供されました (名前はこの投稿のためのものです。「名前空間 XYZ-NAMESPACE」は冗長であることはわかっています)。

MAIN-NAMESPACE の内容は多数のファイルに分割されており、何らかの理由で、Set と LinkedList の両方の operator<< が完全に MAIN-NAMESPACE の外側にある (ただし、Set と LinkedList のヘッダー ファイル内にある) ことがわかりません。セットバージョンは次のとおりです。

ここに問題があります。次のデータ構造があります。

MAIN-NAMESPACE 内のクラスにあるように定義されています。クラスのインスタンスを作成し、セットの 1 つを出力しようとすると、「エラー C2679: バイナリ '<<' : タイプ 'const MAIN-NAMESPACE: :POINTER-COLLECTIONS-NAMESPACE::Set' (または受け入れ可能な変換がない)

ただし、main() 関数を作成し、セット A を作成し、それを埋めて、演算子を使用すると、機能します。

何が問題なのですか?(注:思いつく限り、using と include の任意の組み合わせを試しました)。

0 投票する
2 に答える
1442 参照

c++ - テンプレート化されたostream<<演算子を作成しないコンパイラ

私はクラスを持っており、頭の中で次のように定義されています:

実装ファイルには、次のものがあります。

これはすべてかなりコーシャに見えます。ただし、この演算子(つまり、std :: cout << MyClass())を使用しようとすると、次のリンカーエラーが発生します。

コンパイラが自動的にこれを生成していないことに驚いています...私が間違っていることについて何か提案はありますか?

0 投票する
5 に答える
2414 参照

c++ - C++ で暗黙的な変換を介して演算子を見つけることができません

ヒープ割り当てオブジェクトのラッパーとして機能するクラスを作成しているときに、この単純な例に要約できる暗黙的な型変換の問題に遭遇しました。

以下のコードでは、ラッパー クラスがヒープ割り当てオブジェクトを管理し、暗黙的にそのオブジェクトへの参照に変換します。これにより、暗黙的な変換が行われるため、ラッパー オブジェクトを引数として関数 write(...) に渡すことができます。

ただし、明示的なキャストが行われない限り、operator<<(...) の呼び出しを解決しようとすると、コンパイラは失敗します (MSVC8.0、Intel 9.1、および gcc 4.2.1 コンパイラで確認)。

では、(1) この場合、暗黙的な変換が失敗するのはなぜですか? (2)引数依存のルックアップに関連している可能性がありますか?(3)明示的なキャストなしでこれを機能させるためにできることはありますか?

0 投票する
5 に答える
13394 参照

c++ - C++ const std::map 参照がコンパイルに失敗する

std::mapas constへの参照を渡すと [] 演算子が壊れる理由はありますか? const を使用すると、次のコンパイラ エラー (gcc 4.2) が発生します。

エラー: 'map[name]' の 'operator[]' に一致しません</p>

関数のプロトタイプは次のとおりです。

constまた、の前のキーワードを削除しても問題ありませんstd::map

私が正しく指示されていれば、キーが見つからない場合、[] 演算子は実際に新しいペアをマップに挿入します。これはもちろん、これが起こる理由を説明しますが、これが実際に起こるとは想像できません。許容される動作。

[] の代わりにfindを使用するなど、より良い方法があれば、それをいただければ幸いです。ただし、find が機能しないようです... const不一致の反復子エラーが発生します。

0 投票する
4 に答える
9875 参照

c++ - 「演算子」変数を作成する方法は? (C++)

私は式クラスの作成に取り組んでいます:

ご覧のとおり、演算子クラスが必要なため、これは疑似コードです。私の最初の考えは、可能なすべての演算子の配列を作成し、それを文字列に変換することでしたが、演算子の数が非常に多く、2次元配列以外で文字列に変換する方法のためにうまくいきませんでした.ここで、n[0][0] には最初の演算子があり、n[0][1] にはその演算子文字列があります。

私の式クラスに演算子の値を追加するための提案はありますか?

0 投票する
4 に答える
605 参照

c++ - C++ での += のオーバーロード

operator+ と operator= をオーバーロードした場合、次のようなものが機能するために operator+= をオーバーロードする必要がありますか?

0 投票する
5 に答える
1757 参照

c++ - << 演算子をオーバーロードするにはどうすればよいですか?

が呼び出されるたびに関数を呼び出すつもりm_logger<<"hello"<<"world"です。m_logger はストリーム型です。

だから私は次の署名で << をオーバーロードすることにしました

ただし、vc コンパイラは次のエラーを返します。

エラー C2666: 'operator <<' : 6 つのオーバーロードに同様の変換があります

これを達成する他の方法はありますか?私の目的は、ofstream オブジェクトへのすべての書き込み操作を別の関数に転用することです

自分のカルスのオブジェクトを作成するのはうまくいきますが、システム定義のすべての型を文字列またはchar *に型キャストする通常のオブストリームオブジェクトのように機能させるにはどうすればよいですか。私は1つのアプローチがすべてのタイプの演算子をオーバーロードすることであることを知っていますが、よりクリーンなアプローチはありますか

0 投票する
4 に答える
3777 参照

c++ - ofstream または ostream 型はどのようにすべての型を文字列にキャストしますか?

ostream オブジェクトに渡されたシステム定義のユーザー型は、文字列または char* に変換されますか?

cout<<4<<"Hello World"; のように。

これはどのように達成されますか? << 演算子はすべての型に対してオーバーロードされていますか? オーバーロードされた汎用関数を 1 つだけ使用してそれを達成する方法はありますか? つまり、1 つのパラメーター (void* など) を持つオーバーロードされたオペレーター メソッドを 1 つだけ持つことができ、そのメソッド内で整数を char* に型キャストする方法を決定できます。

テンプレートieを使用して演算子<<をオーバーロードすると、部分的に機能しました

だからこれはうまくいく

ただし、これを行うとコンパイラエラーが発生します

エラー C2678: バイナリ '<<' : 'UIStream' 型の左側のオペランドを取る演算子が見つかりません (または、受け入れ可能な変換がありません)

std::endl もオブジェクトの型ではありませんか?