我有一个类模板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
函数 afriend
以便它可以创建Obj
's,但没有其他人可以(通过复制 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
的价值构造函数?