17

次のコードを検討してください。

#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つのオプションがあります。

  1. innerの外側に移動outerして、クラス テンプレートにします。コードの使用への影響が小さいため、私はこれを好みます。
  2. to_string-メソッドを innerに追加します。

これに対する他の解決策はありますか (コードを使用する際に醜い構文にならないようにします)。

4

1 に答える 1

23

演算子を内部クラス本体に移動して、そのfriend前に置くことができます。次に、パラメーターの型を単に に置き換えますinner

もう 1 つの手法は、inner によってパラメータ化された CRTP ベースから inner を導出することです。次に、パラメータ タイプを CRTP クラスにし、パラメータ参照を派生innerクラスにキャストします。派生クラスのタイプは、推定したテンプレート引数によって与えられます。

于 2011-11-29T09:12:49.867 に答える