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++不允许朋友部分模板专业化的限制)
我认为你不能这样做,因为部分专业化不能被宣布为朋友.
来自标准,[temp.friend]/7
朋友声明不得声明部分专业化.[例如:
Run Code Online (Sandbox Code Playgroud)template<class T> class A { }; class X { template<class T> friend class A<T*>; // error };- 末端的例子]
您必须指定更通用的版本,例如:
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)
| 归档时间: |
|
| 查看次数: |
787 次 |
| 最近记录: |