deklaruje funkcję przyjaciela szablonu klasy szablonu

Mam szablon klasyObj i szablon funkcjimake_obj. Obj maprivate zdefiniowany pojedynczy konstruktor, który odwołuje się do swojego typu szablonu, aby go powiązać.

template <typename T>
class Obj {
  private:
    T& t;
    Obj(T& t)
        : t{t}
    { }
};

template <typename T>
Obj<T> make_obj(T& t) { 
    return {t};
}

Chcę zadeklarowaćmake_obj funkcja afriend tak, aby mógł tworzyćObj, ale nikt inny nie może (z wyjątkiem za pośrednictwem kopiarki).

Próbowałem kilku deklaracji przyjaciół, w tym

friend Obj make_obj(T&);

i

template <typename T1, typename T2>
friend Obj<T1> make_obj(T2&);

Ta ostatnia jest mniej niż pożądaną próbą utworzenia wszystkich instancji szablonówmake_obj przyjacieleObj klasa. Jednak w obu tych przypadkach pojawia się ten sam błąd:

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");
             ^

próbuje zrobićmake_obj("hello"); na przykład.

Jak mogę tylko pozwolićmake_obj dostęp doObjkonstruktor wartości?

questionAnswers(2)

yourAnswerToTheQuestion