[解決済み] クラステンプレートとテンプレートクラスの友人、本当はどうなっているのか?
2023-04-22 03:04:07
質問
例えば、2分木のクラスを作成するとします。
BT
という二分木のクラスを作成し、その木の要素を記述するクラスがあるとします。
BE
のようなものです。
template<class T> class BE {
T *data;
BE *l, *r;
public:
...
template<class U> friend class BT;
};
template<class T> class BT {
BE<T> *root;
public:
...
private:
...
};
これは動作しているように見えます。しかし、その下で何が起こっているのかについて疑問があります。
私はもともとフレンドを
template<class T> friend class BT;
を使用する必要があるようです。
U
(あるいは
T
を使うのはなぜでしょうか?それは、ある特定の
BT
が特定の
BE
クラスと友達ですか?
テンプレートと友人に関するIBMのページには、関数のための異なるタイプの友人関係の例がありますが、クラスはありません(そして、構文はまだ解決策に収束していないと推測されます)。私は、定義したいタイプの友人関係に対して正しい仕様を取得する方法を理解することを希望します。
どのように解決するのですか?
template<class T> class BE{
template<class T> friend class BT;
};
テンプレート・パラメータは互いにシャドウできないため、許可されません。ネストされたテンプレートは異なるテンプレートパラメータ名でなければなりません。
template<typename T>
struct foo {
template<typename U>
friend class bar;
};
これはつまり
bar
の友人であり
foo
とは関係なく
bar
のテンプレート引数に関係なく
bar<char>
,
bar<int>
,
bar<float>
そして、その他の
bar
の友人となる。
foo<char>
.
template<typename T>
struct foo {
friend class bar<T>;
};
これはつまり
bar
の友人であり
foo
というのは
bar
のテンプレート引数が
foo
's. のみ
bar<char>
の友人となるのは
foo<char>
.
あなたの場合
friend class bar<T>;
で十分でしょう。
関連
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。