与clang模板阴影错误

时间:2014-07-02 09:25:19

标签: c++ templates g++ clang++ template-templates

正如以下代码段中的注释所示,这是gcc 4.4的解决方法。我现在应该删除的bug。有关此背景,请参阅Template template parameters and variadic templates with gcc 4.4

在任何情况下,这都会在Debian Wheezy上发出错误,其中包含clang 3.4.2-4,从unstable返回。这适用于gcc 4.9也可以从Debian Wheezy的不稳定版(和4.7版)中移植。

// Workaround for gcc 4.4 bug. See https://stackoverflow.com/q/8514633/350713
template <typename S, typename T,
      template <typename S, typename T, typename... Args> class C,
      typename... Args>
struct maptype
{
  typedef C<S, T, Args...> type;
};

int main(void){}

错误是

clang++ -o shadow.ocl -c -ftemplate-depth-100 -fno-strict-aliasing -fno-common -ansi -Wextra -Wall -Werror -Wno-unused-function -Wc++0x-compat -Wpointer-arith -Wcast-qual -Wcast-align -std=c++11 -mtune=native -msse3 -O3 shadow.cc
shadow.cc:3:23: error: declaration of 'S' shadows template parameter
          template <typename S, typename T, typename... Args> class C,
                             ^
shadow.cc:2:20: note: template parameter is declared here
template <typename S, typename T,
                   ^
shadow.cc:3:35: error: declaration of 'T' shadows template parameter
          template <typename S, typename T, typename... Args> class C,
                                         ^
shadow.cc:2:32: note: template parameter is declared here
template <typename S, typename T,
                               ^
2 errors generated.

我在SO上看到至少一些表面上类似的问题,即 Clang VS VC++:"error: declaration of 'T' shadows template parameter"C++ template that used to work in old gcc results in 'shadows template parameter' error in clang++ 但对我来说,这是不是一个不同的问题或同样的问题是不明显的。

澄清表示赞赏。我不定期编写C ++,自从我查看模板模板参数以来已经有一段时间了。

1 个答案:

答案 0 :(得分:4)

模板模板参数S中的名称TArgsC

template <typename S, typename T, typename... Args> class C

是多余的,与S中的TArgsmaptype具有相同的名称。 名称相同的事实会在clang上产生阴影错误。

所以你可以写

template <typename S,
          typename T,
          template <typename, typename, typename...> class C,
          typename... Args>
struct maptype;

或提供不同的名称(出于文档目的,因为它们无法使用)

template <typename S,
          typename T,
          template <typename S_Type, typename T_Type, typename... Args_Type> class C,
          typename... Args>
struct maptype;