déclarer modèle amie fonction de la classe de modèle

J'ai un modèle de classe Obj et un modèle de fonction make_obj. Obj a un private seul constructeur défini, qui prend une référence à son basé sur un modèle de type à se lier à.

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

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

Ce que je veux, c'est de déclarer la make_obj fonction d'un friend afin qu'il puisse créer Obj's, mais personne ne peut (sauf via la copie ctor).


J'ai essayé plusieurs ami déclaration, y compris

friend Obj make_obj(T&);

et

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

Ce dernier étant moins souhaitable tentative à ce que toutes les instanciations du modèle de make_obj amis de la Obj classe. Toutefois, dans ces deux cas, j'obtiens le même message d'erreur:

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

essayer de faire make_obj("hello"); pour les fins de l'exemple.

Comment puis-je autoriser uniquement les make_obj accès à Obj's la valeur constructeur?

InformationsquelleAutor Ryan Haining | 2013-09-13