11

想象一下我们有这样的代码:

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;

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

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

4

2 回答 2

9

我认为您不能这样做,因为不能将部分专业化声明为朋友。

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

友元声明不得声明部分特化。[ 例子:

template<class T> class A { };
class X {
  template<class T> friend class A<T*>; // error
};

—结束示例]

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

template <class, class> friend class Element;

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

using BeFriend = Element<T, int>;
friend BeFriend;
于 2015-11-06T10:12:41.537 回答
2

问题不在于别名,问题在于 “不能将部分专业化声明为朋友”

template <class, class> friend class Element;        // OK

template <class, class> friend class Element<T, T>;  // Error
于 2015-11-06T10:20:27.297 回答