是否可以将别名模板标记为朋友?

时间:2015-11-06 09:26:50

标签: c++ templates c++11 friend template-aliases

想象一下,我们有这个代码:

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 ++不允许与部分模板专业化相关的限制)

2 个答案:

答案 0 :(得分:9)

我认为你不能这样做,因为部分专业化不能被宣布为朋友。

从标准[temp.friend]/7

开始
  

朋友声明不得声明部分专业化。 [   例如:

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