下面的代码在没有GCC警告的情况下进行编译,并且对clang(clang和GCC的任何c ++ 11兼容版本)发出错误。 哪个编译器相对于标准是正确的? 具体来说,是否允许将非部分专用的模板别名声明为朋友,这是一个类的部分模板专用化?
这让我认为可能是不允许的:
但是,这使我认为可以允许这样做:
This post提出了一个非常相似的问题,但是对于中间模板别名的具体用法,没有给出明确的答案。
template<typename T,typename N> class B{};
template<typename T> class A{
// template<typename U> friend class B<T,U>; fails as expected
template<typename N> using alias = B<T,N>;
template<typename N> friend class alias;
};
意图:使用中间别名将部分专业名称声明为朋友的合法方法(解决方法)。
结果:GCC对此感到满意并产生了预期的行为。铛产生以下错误:
<source>:7:35: error: redefinition of 'alias' as different kind of symbol
template<typename N> friend class alias;
^
<source>:6:22: note: previous definition is here
template<typename N> using alias = B<T,N>;