【发布时间】:2015-01-27 14:33:08
【问题描述】:
感谢 Daniel Frey 对this post 的回答,我知道如何向具有相同模板参数的模板类声明模板友元函数。不幸的是,使用附加模板参数声明友元函数的语法仍然让我无法理解。我想实现这样的目标:
template <typename T>
class Obj;
template <typename T>
Obj<T> make_obj(T t);
template <typename T, typename RetVal>
RetVal ret_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 RetVal>
friend RetVal ret_obj<T, RetVal>(T t);
};
template <typename T>
Obj<T> make_obj(T t) {
return Obj<T>(t);
}
template <typename T, typename RetVal>
RetVal ret_obj(T t) {
return RetVal(make_obj(t).t);
}
我知道在 this post 中已经提出了相同的问题,但那里接受的答案似乎不是我想要的:将参数名称更改为 T2 使该函数成为对象,而我想保持T 与课堂上的相同。
【问题讨论】:
-
作为猜测,我会说“你不能”。将会有一些变通方法可以使其工作,例如通过帮助器
struct反弹函数。 -
不可能。友元声明不能声明部分特化。
-
@Yakk 是的,我想我可以使用另一个类,如果必须的话,我会这样做;我只是想知道是否有直接的方法可以做到这一点。如果没有就太糟糕了。 :(
-
@T.C.并且无论如何都没有功能的部分专业化。嗯:你能把使用别名做朋友吗?