私は「宣言以外のテンプレートクラスのフレンドテンプレート関数を定義する方法」(SO/cppreference)を見つけましたが、ミックスに別の内部非テンプレートクラスを追加するとどうするのですか?両方のクラス以外のテンプレートクラスの内部で、非テンプレートクラス内で宣言されたフレンド関数を定義する方法はありますか?
I.e. (外部)operator<<
は、以下の例からclass Internal
で宣言された定義する方法:
#include <iostream>
template <typename T>
class External {
public:
explicit External(T initial) : value{initial} {}
class Internal {
public:
Internal(const External& e) : internal_value{e.value} {}
private:
friend std::ostream& operator<<(std::ostream& os, const Internal& i);
// ^^^ this one
/* body
{
return os << i.internal_value;
}
*/
T internal_value;
};
friend std::ostream& operator<<(std::ostream& os, const External& e)
{
return os << Internal{e};
}
private:
T value;
};
int main()
{
std::cout << External<int>{5};
}
:保守可能な方法でそれを達成するための方法は、オペレータ定義インラインを維持し、代わりにそこに仕事をして、(は、テンプレートパラメータに依存です)メンバ関数へのデリゲートすることです@StoryTellerルックアップルールは何ですか? –
@RichardHodges - あなたは何を知っているのですか?私はルックアップのルールを混乱させる可能性があります。それは、OPのインラインフレンド機能であり、ADLによってのみ検出されます。 – StoryTeller
これは広すぎると投票した人は...? –