朋友别名模板无法使用clang编译

时间:2019-04-12 09:26:12

标签: c++11 gcc friend clang++ partial-specialization

下面的代码在没有GCC警告的情况下进行编译,并且对clang(clang和GCC的任何c ++ 11兼容版本)发出错误。 哪个编译器相对于标准是正确的? 具体来说,是否允许将非部分专用的模板别名声明为朋友,这是一个类的部分模板专用化?

这让我认为可能是不允许的:

  1. cppreference说:“ 朋友声明不能引用部分专业化 [...]”。
  2. 而且:“类型别名声明引入了一个名称,该名称可以用作由type-id表示的类型的同义词。它没有引入新的类型 [...]” 。
  3. 最后:“ 功能模板和类模板声明都可能与朋友说明符一起出现[...]”。它隐式地排除了模板别名作为类的朋友作为实际模板别名而不是作为别名的类模板的可能性,而别名类模板是代码段中的部分专业知识。

但是,这使我认为可以允许这样做:

  1. cppreference说:“ 别名模板是模板 [...]”。我不明白模板别名是一个独特的模板。因此,将其声明为以下示例中的朋友而不对类模板别名进行部分指定是有效的……或无效。
  2. This code(不是我提供的)也提供了一种解决方法,让我认为没有明显的理由使以下代码格式错误。

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>;

0 个答案:

没有答案