我有一个类模板Obj
和一个函数模板make_obj
. Obj
has a 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
的,但没有其他人可以(除了通过复制者)。
我尝试过几种朋友声明,包括
friend Obj make_obj(T&);
and
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
的值构造函数?
您需要一些前向声明:
template <typename T>
class Obj;
template <typename T>
Obj<T> make_obj(T t);
template <typename T>
class Obj {
private:
T & t;
Obj (T & t) : t(t) { }
Obj() = delete;
friend Obj make_obj<T>(T t);
};
template <typename T>
Obj<T> make_obj(T t) {
return Obj<T>(t);
}
活生生的例子
顺便说一句:我认为你并不真正想要T & t;
为你的类的成员变量。大概T t;
是一个更好的选择;)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)