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

2023-12-25

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

这是代码:

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)
    {
       // ...
    }
    // ...
};

我这样调用这个模板函数:

int main()
{
   // ... 
   const int DENOISE_UR[3][4] = {/*...*/};
   Partition<1,2> partition;
   partition.readPattern(DENOISE_UR);
   // ...
}

使用 g++ 进行编译。

使用clang++(linux)编译时(clang++ -std=c++11 xxx.cpp),它导致了以下编译错误:

error: no matching function for call to 'readPattern'
   note: candidate template ignored: substitution failure[ with r = 3, c = 4 ]
         template<int r, int c> void readPattern(const matrix<r,c> &pattern)

Why?


这是 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

候选模板被忽略:替换失败(clang错误,但g++错误) 的相关文章

随机推荐