質問

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

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

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

これに対する他のソリューションはありますか(使用コードにugい構文をもたらさない)?

役に立ちましたか?

解決

オペレーターを内部クラスの本体に移動して置くことができます friend その前に。次に、パラメータータイプをJustで置き換えます inner.

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top