我有一个类模板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的价值构造函数?