非定義コンテキストでのテンプレート引数控除の回避策
-
25-10-2019 - |
質問
次のコードを検討してください。
#include <iostream>
template<class T>
struct outer {
struct inner {};
};
template<class T>
std::ostream& operator<<(std::ostream & stream,
typename outer<T>::inner const& value) {
std::cout << "An outer::inner!";
return stream;
}
int main() {
outer<float>::inner foo;
std::cout << foo << std::endl; // does not compile
}
これはコンパイルされません typename outer<T>::inner
aです 非済みのコンテキスト (説明したように ここ)、つまり、テンプレート - argument-typeをコンパイラによって推定できないことを意味します(読み取ります この答え 理由のために)。私が見るように、私はそれを機能させるための2つのオプションがあります:
- 動く
inner
の外outer
クラステンプレートにします。使用コードへの影響は小さいため、これを好みます。 - Aを追加します
to_string
- 内側へのメソッド。
これに対する他のソリューションはありますか(使用コードにugい構文をもたらさない)?
解決
オペレーターを内部クラスの本体に移動して置くことができます friend
その前に。次に、パラメータータイプをJustで置き換えます inner
.
別の手法は、内側によってパラメーター化されたCRTPベースから内側を導出することです。次に、パラメーターをCRTPクラスのタイプにし、派生にパラメーター参照をキャストします inner
クラス、そのタイプは、あなたが推測するテンプレート引数によって与えられます。
所属していません StackOverflow