显式实例化失败了gcc - 为什么?

时间:2015-12-10 13:38:41

标签: c++ variadic-templates variadic-functions

我有以下(简化,因而愚蠢)代码:

template <typename Function, Function f, typename... Arguments>
void call_wrapper(Arguments... arguments)
{
    f(arguments...);
}

然后:

void foo() { return; }
template void call_wrapper<decltype(foo), foo>();

void bar(int x) { return; }
template void call_wrapper<decltype(bar), bar, int>(int x);

当我使用clang 3.5.0编译它时,它可以工作;但如果我尝试用gcc 4.9.3或5.1.1编译它,我得到:

a.cpp:10:15: error: template-id ‘call_wrapper<void(), foo>’ for ‘void call_wrapper()’ does not match any template declaration
 template void call_wrapper<decltype(foo), foo>();
               ^
a.cpp:13:15: error: template-id ‘call_wrapper<void(int), bar, int>’ for ‘void call_wrapper(int)’ does not match any template declaration
 template void call_wrapper<decltype(bar), bar, int>(int x);
               ^

为什么?

注意:如果有任何区别,我对C ++ 11答案比对C ++ 14 / C ++ 17答案更感兴趣。无论如何,这就是我调用gcc的方式。

1 个答案:

答案 0 :(得分:2)

其中decltype(fun)是函数的fun的类型是函数的类型。虽然使用fun看起来非常像它应该具有相同的类型,但它实际上不是:你不能拥有一个函数类型的对象,即当作为参数传递时,乐趣的类型恰好是{{ 1}}。如果您将指针滑入实例化(如decltype(fun)*所示)或在应用foo bar`之前显式衰减类型),它应该可以工作:

decltype() (as shown for

我意识到有关使用clang的实例化的评论。似乎clang错误地接受了原始代码。