在C ++ 1z中声明好友模板类模板会产生错误:'template <class t =“”> class A'的特化必须出现在命名空间中

时间:2015-10-31 17:51:54

标签: c++ templates gcc c++17 c++-concepts

我正在使用boost asio coroutines,我想使用新的文件系统TS(-stdc ++ fs),所以我升级到GCC 6-20151025快照。它工作正常。但后来我打开了-std = c ++ 1z,我在boost的源代码中遇到了一个错误。我隔离了错误,这是一个最小的例子:

// { dg-do compile }
// { dg-options "-std=c++1z" }

template< typename T >
class A
{
};

template<>
class A< void >
{
        template< typename X >
        friend class A;
};

使用-std = c ++ 14进行编译很好,但是为-std = c ++ 1z生成以下错误:

error: specialization of ‘template<class T> class A’ must appear at namespace scope
  friend class A;
               ^

我在源代码中跟踪了错误,并且在pt.c中新引入的函数`maybe_new_partial_specialization'中出现了异常行为。特别是在仅在概念TS为active时激活的条件。

我想首先检查这是概念TS / C ++ 1z中的预期行为,然后再将其报告为错误。

谢谢。

编辑:根据下面的答案,结果证明是一个错误,因此我报告了它here

1 个答案:

答案 0 :(得分:2)

概念文件附件A总结了向后兼容性问题。它只包含一个条目:

enter image description here

您遇到的行为并非意图和回归,请报告。