I have a class template Obj
and a function template make_obj
. Obj
has a private
single constructor defined, which takes a reference to its templated type to bind to.
template <typename T>
class Obj {
private:
T& t;
Obj(T& t)
: t{t}
{ }
};
template <typename T>
Obj<T> make_obj(T& t) {
return {t};
}
What I want is to declare the make_obj
function a friend
so that it can create Obj
's, but no one else can (except via the copy ctor).
I have tried several friend declaration including
friend Obj make_obj(T&);
and
template <typename T1, typename T2>
friend Obj<T1> make_obj(T2&);
The latter being a less than desirable attempt at making all template instantiations of make_obj
friends of the Obj
class. However in both of these cases I get the same error:
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");
^
trying to do make_obj("hello");
for example purposes.
How can I allow only make_obj
access to Obj
's value contructor?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…