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

Ad *_*d N 10 c++ templates friend c++11 template-aliases

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

template <class, class>
class Element
{};

template <class T>
class Util
{
public:
   template <class U>
   using BeFriend = Element<T, U>;
};
Run Code Online (Sandbox Code Playgroud)

是否可以标记BeFriend为朋友?(Util任何其他类)

 编辑

尝试了"明显"的语法,但是Clang 3.6都失败了.

template <class> friend class BeFriend;
template <class> friend BeFriend;
Run Code Online (Sandbox Code Playgroud)

我不知道第二种语法,但在这个答案中找到了它.它似乎对模板别名起作用(并且是必需的),但在别名被模板化的情况下没有帮助.

(注意:正如有些人可以从最小的例子中推断,我正在寻找一种方法来解决C++不允许朋友部分模板专业化的限制)

son*_*yao 9

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

来自标准,[temp.friend]/7

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

template<class T> class A { };
class X {
  template<class T> friend class A<T*>; // error
};
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

您必须指定更通用的版本,例如:

template <class, class> friend class Element;
Run Code Online (Sandbox Code Playgroud)

或完整的指定版本,例如:

using BeFriend = Element<T, int>;
friend BeFriend;
Run Code Online (Sandbox Code Playgroud)