クラス テンプレートObj
と関数テンプレートがありmake_obj
ます。 Obj
単一のコンストラクターが定義されており、private
バインド先のテンプレート化された型への参照を取ります。
template <typename T>
class Obj {
private:
T& t;
Obj(T& t)
: t{t}
{ }
};
template <typename T>
Obj<T> make_obj(T& t) {
return {t};
}
私が望むのは、make_obj
関数 aを宣言friend
して を作成できるようにすることObj
ですが、他の誰も作成できません (コピー ctor を使用する場合を除く)。
を含むいくつかの友人宣言を試しました
friend Obj make_obj(T&);
と
template <typename T1, typename T2>
friend Obj<T1> make_obj(T2&);
後者は、クラスのmake_obj
フレンドのすべてのテンプレートのインスタンス化を行うための望ましい試みとは言えません。Obj
ただし、これらのケースの両方で、同じエラーが発生します。
error: calling a private constructor of class 'Obj<char const[6]>'
return {t};
^
note: in instantiation of function template specialization
'make_obj<const char *>' requested here
auto s = make_obj("hello");
^
例としてやろうとしていmake_obj("hello");
ます。
の値コンストラクターmake_obj
へのアクセスのみを許可するにはどうすればよいですか?Obj