我有替换失败的问题,一些类似问题的答案对我没有帮助。
以下是代码:
{
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"term": {
"make": "HeLlo"
}
}
]
}
}
}
}
}
我称这个模板函数如下:
template<int dim, int loop>
class Reference{
public:
//...
template<int r, int c> using matrix_t = int[r][c];
Reference(const matrix_t<dim, loop> &mat){}
};
template<int dim, int loop>
class Partition{
// ...
public:
// ...
template<int r, int c> using matrix = int[r][c];
template<int r, int c> void readPattern(const matrix<r,c> &pattern)
{
// ...
}
// ...
};
使用g ++编译。
使用clang ++(linux)编译(int main()
{
// ...
const int DENOISE_UR[3][4] = {/*...*/};
Partition<1,2> partition;
partition.readPattern(DENOISE_UR);
// ...
}
)时,会导致以下编译错误:
clang++ -std=c++11 xxx.cpp
为什么?
答案 0 :(得分:4)
这是铿锵的错误;当在类模板中定义定义数组类型的别名模板时,它会出错。事实上它可以被利用到crash the compiler:
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>;
事实上,你甚至不需要使用 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!
这是now fixed(修复程序应该在clang发行版本3.8.0中):
[AST]为DependentSizedArrayType
执行其他规范化我们使用相同的元素类型处理DependentSizedArrayTypes但是 不同大小的表达式等同于规范。这会导致 模板实例化过程中的奇怪行为。
这修复了PR24212。