У меня есть шаблонный класс Obj
и make_obj
. Obj
имеет один определенный конструктор, который ссылается на свой шаблонный тип для привязки к.
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
, но никто не может (кроме как с помощью copy 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
конструктору значения?