这是 clang 中的一个错误;当在类模板中定义定义数组类型的别名模板时,它会出现错误行为。事实上它可以被利用使编译器崩溃 http://llvm.org/bugs/show_bug.cgi?id=24212:
template<int I>
struct S {
template<int J> using T = int[J];
using U = T<I>;
};
S<3>::U a;
因为在你的情况下Reference::matrix_t
不依赖于模板参数Reference
,最简单的解决方法是移动matrix_t
到命名空间范围:
namespace impl { template<int r, int c> using matrix_t = int[r][c]; }
// ...
template<int dim, int loop>
class Reference {
//...
template<int r, int c> using matrix_t = impl::matrix_t<r, c>;
事实上,你甚至不需要use impl::matrix_t
解决该错误:
namespace magic { template<int r, int c> using unused = int[r][c]; } // Huh?
// ...
template<int dim, int loop>
class Reference {
//...
template<int r, int c> using matrix_t = int[r][c]; // Look ma, no hands!
This is (修复应该在 clang 发布版本 3.8.0 中):
[AST] 对 DependentSizedArrayType 执行额外的规范化
我们使用相同的元素类型处理 DependentSizedArrayTypes,但是
不同的大小表达式等同于规范。这会导致
模板实例化期间的奇怪行为。
这修复了 PR24212。