Fah*_*tha 3 c++ templates g++ template-templates clang++
正如以下代码片段中的注释所说,这是 gcc 4.4 的解决方法。错误,我现在可能应该删除它。有关此背景的信息,请参阅带有 gcc 4.4 的模板模板参数和可变参数模板。
在任何情况下,这都会在带有 clang 3.4.2-4 的 Debian Wheezy 上出现错误,从不稳定向后移植。这适用于 gcc 4.9,也从 Debian Wheezy 上的不稳定(和 4.7)向后移植。
// Workaround for gcc 4.4 bug. See /sf/ask/596024341/
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){}
Run Code Online (Sandbox Code Playgroud)
错误是
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.
Run Code Online (Sandbox Code Playgroud)
我至少在 SO 上看到了几个表面上类似的问题,即 Clang VS VC++:"error: Declaration of 'T' shadows template parameter"和 C++ 模板,用于在旧的 gcc 中工作导致 clang++ 中的 'shadows template parameter' 错误 但对我来说它们是不同的问题还是相同的问题并不明显。
澄清表示赞赏。我不经常写 C++,自从我看模板模板参数已经有一段时间了。
名称S,T,Args在模板的模板参数C
template <typename S, typename T, typename... Args> class C
Run Code Online (Sandbox Code Playgroud)
是多余的并且与S, T, Argsfrom具有相同的名称maptype。名称相同的事实会在 clang 上产生阴影错误。
所以你可以写
template <typename S,
typename T,
template <typename, typename, typename...> class C,
typename... Args>
struct maptype;
Run Code Online (Sandbox Code Playgroud)
或给出不同的名称(用于文档目的,因为它们不能被使用)
template <typename S,
typename T,
template <typename S_Type, typename T_Type, typename... Args_Type> class C,
typename... Args>
struct maptype;
Run Code Online (Sandbox Code Playgroud)