Rya*_*ing 31 c++ templates friend c++11
我有一个类模板Obj
和一个函数模板make_obj
. Obj
有一个private
构造函数定义,它引用其绑定的模板类型.
template <typename T>
class Obj {
private:
T& t;
Obj(T& t)
: t{t}
{ }
};
template <typename T>
Obj<T> make_obj(T& t) {
return {t};
}
Run Code Online (Sandbox Code Playgroud)
我想要的是声明make_obj
函数a,friend
以便它可以创建Obj
,但没有其他人可以(除了通过复制ctor).
我已经尝试了几个朋友声明,包括
friend Obj make_obj(T&);
Run Code Online (Sandbox Code Playgroud)
和
template <typename T1, typename T2>
friend Obj<T1> make_obj(T2&);
Run Code Online (Sandbox Code Playgroud)
后者是完成该类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");
^
Run Code Online (Sandbox Code Playgroud)
试图做make_obj("hello");
的例子.
我怎样才能只允许make_obj
访问Obj
价值构造者?
Dan*_*rey 44
您需要一些前向声明:
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);
}
Run Code Online (Sandbox Code Playgroud)
而BTW:我认为你真的不想要T & t;
你的班级成员变量.可能T t;
是一个更好的选择;)
使用自动返回类型语法,您只需要向前声明函数,一切正常。这是一个例子
template <typename T>
auto make_obj(T t);
template <typename T>
class Obj {
private:
T & t;
Obj (T & t) : t(t) { }
Obj() = delete;
friend auto make_obj<T>(T t);
};
template <typename T>
auto make_obj(T t) {
return Obj<T>{t};
}
int main() {
make_obj(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)