次のコードを検討してください。
#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
であるため (ここで説明されているように)、コンパイルされません。つまり、コンパイラはテンプレート引数の型を推定できません (理由については、この回答をお読みください)。私が見ているように、それを機能させるには2つのオプションがあります。
inner
の外側に移動outer
して、クラス テンプレートにします。コードの使用への影響が小さいため、私はこれを好みます。to_string
-メソッドを innerに追加します。
これに対する他の解決策はありますか (コードを使用する際に醜い構文にならないようにします)。