候选模板被忽略:替换失败(clang但不是g ++错误)

时间:2015-07-22 10:27:04

标签: c++ templates c++11 g++ clang

我有替换失败的问题,一些类似问题的答案对我没有帮助。

以下是代码:

{
  "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

为什么?

1 个答案:

答案 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。