問題タブ [friend-function]
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.
c++ - テンプレートクラスのテンプレートフレンド機能
この質問で説明されている問題 (テンプレート関数をテンプレート クラスのフレンドとして宣言する) に苦労していましたが、2 番目の答えは私がやりたいことだと思います (テンプレート関数を前方宣言し、特殊化をフレンドとして指定します)。 )。わずかに異なる解決策が実際に正しいのか、それとも Visual C++ 2008 でたまたま機能するのかについて質問があります。
テストコードは次のとおりです。
まず、私が見つけた奇妙なことの 1 つは、の前方宣言を変更してoperator<<
一致しないようにすると (たとえば、std::ostream& operator<<(std::ostream &out, int fake);
すべてが正しくコンパイルされ、正しく動作することでした (明確にするために、そのような関数を定義する必要はありません。ただし、リンク先の質問のように、前方宣言を削除すると、コンパイラがフレンド関数ではなくデータ メンバーを宣言していると考えているように見えるため、問題が発生します。 Visual C++ 2008 のバグ。
興味深いのは、上記のコードで forward 宣言を削除し、代替の friend 宣言を使用する場合です。テンプレート パラメーターU
は、次の署名には表示されないことに注意してください。このメソッドもコンパイルされ、正しく動作します (他に何も変更する必要はありません)。私の質問は、これが標準に準拠しているのか、それとも Visual C++ 2008 の特異性に準拠しているのかということです (参考書で適切な答えを見つけることができませんでした)。
フレンド宣言template <typename U> friend ... const test<U> &t);
も機能しますが、実際にはこれにより、オペレーターの各インスタンスが のfriend
任意のインスタンスにアクセスできるようになりますがtest
、私が望むのは、 のプライベート メンバーにtest<T>
は からのみアクセスできるようにすることoperator<< <T>
です。test<int>
内部でをインスタンス化しoperator<<
、プライベート メンバーにアクセスして、これをテストしました。を出力しようとすると、コンパイル エラーが発生するはずtest<double>
です。
概要: 上記のコードで forward 宣言を削除して代替の friend 宣言に切り替えると、(Visual C++ 2008 の場合) 同じ結果になるようです -- このコードは実際に正しいのでしょうか?
更新: コードに対する上記の変更はいずれも gcc では機能しないため、これらは Visual C++ コンパイラのエラーまたは「機能」であると推測しています。それでも、標準に精通している人々からの洞察をいただければ幸いです。
c++ - 1つの特定の関数とクラスに対してのみフレンド関数を宣言するにはどうすればよいですか?
私のコードの何が問題になっていますか?
以下のコードをGNUG++環境でコンパイルしようとすると、次のエラーが発生します。
c++ - フレンド機能連携エラー
正常にコンパイルされたクラス「Vector3」があります。これには、Vector3 が 2 番目のオペランドである場合に * および << 演算子をオーバーロードするなど、非フレンド関数とフレンド関数の両方が含まれています。問題は、演算子がオーバーロードされているかどうかに関係なく、フレンド関数のいずれにもリンクできないことです。したがって、エラーが演算子のオーバーロードに固有のものではないことを確認できます。リンクに使用する g++ コマンドは以下の通りです (末尾の Makefile も参照してください)。
次のエラーが発生しました。
以下は、ソース ファイル内の関連コードです。クラスごとに個別の .hpp と .cpp を作成するという慣例に従います。
最後に、これが私の Makefile です。
最も奇妙なことは、Vector3.cpp ファイルも main.cpp に含めてから、Makefile の OBJS から Vector3.o を削除すると、プログラムが正常にリンクすることです。私はこれを理解することはできません。私を助けてください!!
c++ - テンプレート定義のフレンド関数
私の質問はこれに少し関連しています。
一部のクラスの演算子 << をオーバーロードしたいのですが、両方が機能する2つの異なる表記法を見つけました。
同じものを異なる表記法で定義していますか? または、最初のバージョンは、<< のどのインスタンス (この場合、私のクラス A と同じ T を持つインスタンスのみ) が A のフレンドであるかにより制限的ですか?
c++ - フレンド関数と静的メンバー関数のどちらを使用しますか?
クラスのプライベート メンバーにアクセスする場合は、非メンバー関数をクラスのフレンドにします。これにより、静的メンバー関数と同じアクセス権が付与されます。どちらの選択肢も、そのクラスのどのインスタンスにも関連付けられていない関数を提供します。
いつフレンド機能を使用する必要がありますか? いつ静的関数を使用する必要がありますか? 両方とも問題を解決するための実行可能なオプションである場合、それらの適合性をどのように比較検討しますか? デフォルトで優先すべきものはありますか?
たとえばfoo
、プライベート コンストラクターのみを持つクラスのインスタンスを作成するファクトリを実装する場合、そのファクトリ関数を静的メンバーにする必要があるかfoo
( を呼び出すfoo::create()
)、それともフレンド関数にする必要があるか ( を呼び出すcreate_foo()
)?
c++ - テンプレート クラス内でテンプレート フレンド関数の定義を分割する方法は?
次の例は正常にコンパイルされますが、operator<<() の宣言と定義を分離する方法がわかりません。これはこの特定のケースです。
定義を分割しようとするたびに、友人が問題を引き起こし、gcc は operator<<() 定義が正確に 1 つの引数を取る必要があると不平を言います。
Operator<<() には、さまざまな種類の出力ストリーム (std::cout、std::wcout、または boost::asio::ip::tcp::iostream) で動作する自由な最初のパラメーターがあるはずです。2 番目のパラメーターは、周囲のクラスの特殊なバージョンにバインドする必要があります。
その上、非メンバー関数を使用することは、非メンバー関数がクラスのプライベート属性にアクセスできないため、定義と宣言を分割することと同等ではありません。
c++ - Visual Studio 2008 で "friend" 関数の宣言が失敗する
グローバル関数をクラスの「フレンド」として宣言しようとしています:
このコードを Visual C++ 2008 でコンパイルすると、次のようになります。
template <typename T> friend T first::FirstMethod();
代わりに使用すると、次のようになります。
フレンド関数を宣言する適切な方法は何ですか?
c++ - フレンド関数を使用した前方宣言:不完全な型の無効な使用
このコードをコンパイルしようとすると、いくつかのエラーが発生しました。例えば
不完全なタイプの無効な使用
このコードの問題は何ですか?
c++ - ADLとフレンド注射
次のコードを検討してください。
コンパイラは大きく反対しているようです。(MSVC08/10 はノー、GCC<4.5 はイエス、4.5 はノー、sun 5.1 はイエス、インテル 11.1 もイエス、comeau はノー (どちらも EDG))。
「C++ テンプレート - 完全なガイド」によると:
... 関連付けられたクラス内のフレンドのルックアップを含む呼び出しにより、実際にクラスがインスタンス化されると想定されています ... これは、C++ 標準を作成した人々によって明確に意図されていましたが、標準では明確に記述されていません。
標準で関連するセクションが見つかりませんでした。参照はありますか?
次のバリエーションを検討してください。
ここでの重要な問題は、によって注入された実行可能な関数がX<1>
ADL 中に表示されるX<0>
かどうかです。それらは関連していますか?上記のすべてのコンパイラは、このコードを受け入れますが、Comeau はリラックス モードでのみ受け入れます。これについて標準が何を言わなければならないのかもわかりません。
それについてどう思いますか?
c++ - フレンド機能が認識されない
私はいくつかの友人機能を持つ次のクラスを持っています:
最後の関数を次のようにクラス内のフレンド関数として配置すると:
overlapT was not declared in this scope
このコードは、 main.cpp で追加のエラーを生成します。他のオーバーラップ関数 (他のファイルでオーバーロードされている) については、それらがクラス内のフレンド関数である場合に同様のエラーが発生します: error: no matching function for call to 'overlap()'
. 私は別のファイルで同じように信じているものでフレンド関数を使用しましたが、コンパイル エラーはありません。この奇妙なエラーの原因は何ですか?
さて、このエラーを例証する小さなプログラムを手に入れました!
main.cpp
Teleport.h
テレポート.cpp
コンパイル エラー:
静的変数のない他のクラスは問題なく動作するため、静的変数がこれと関係があるのではないかと思います。
編集:実際には、静的変数は問題ではないようです。static
Teleport クラスの定義からキーワードを削除し、名前を付けてbool Teleport::veracity;
;をコメントアウトしました。それにもかかわらず、私はまだ2つのエラーが発生します