正如以下代码段中的注释所示,这是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 ++,自从我查看模板模板参数以来已经有一段时间了。
答案 0 :(得分:4)
模板模板参数S
中的名称T
,Args
,C
template <typename S, typename T, typename... Args> class C
是多余的,与S
中的T
,Args
,maptype
具有相同的名称。
名称相同的事实会在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;