我有一个类模板 Obj
和一个函数模板 make_obj
。 Obj
定义了一个 private
单个构造函数,该构造函数采用对其模板化类型的引用来绑定(bind)。
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
函数声明为 friend
以便它可以创建 Obj
的,但没有其他人可以(除了通过复制ctor)。
我尝试了几个 friend 声明,包括
friend Obj make_obj(T&);
和
template <typename T1, typename T2>
friend Obj<T1> make_obj(T2&);
后者在使 Obj
类的所有 make_obj
friend 的模板实例化方面不太理想。但是在这两种情况下,我都会遇到相同的错误:
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;
是更好的选择 ;)
关于c++ - 声明模板类的模板友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18792565/