想象一下,我们有这个代码:
template <class, class>
class Element
{};
template <class T>
class Util
{
public:
template <class U>
using BeFriend = Element<T, U>;
};
是否可以将BeFriend
标记为朋友? (Util
或任何其他类。)
尝试了“明显”的语法,但是Clang 3.6都失败了。
template <class> friend class BeFriend;
template <class> friend BeFriend;
我不知道第二种语法,但found it in this answer。它似乎对非 -template别名起作用(并且是必需的),但在别名被模板化的情况下没有帮助。
(注意:正如有些人可以从最小的例子中推断出来的那样,我正在寻找一种方法来解决C ++不允许与部分模板专业化相关的限制)
答案 0 :(得分:9)
我认为你不能这样做,因为部分专业化不能被宣布为朋友。
开始朋友声明不得声明部分专业化。 [ 例如:
template<class T> class A { }; class X { template<class T> friend class A<T*>; // error };
-end example]
您必须指定更通用的版本,例如:
template <class, class> friend class Element;
或完整指定的版本,例如:
using BeFriend = Element<T, int>;
friend BeFriend;
答案 1 :(得分:2)
问题不在于别名,问题在于 &#34;部分专业化不能被声明为朋友&#34; 。
template <class, class> friend class Element; // OK
template <class, class> friend class Element<T, T>; // Error