我有以下(简化,因而愚蠢)代码:
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的方式。
答案 0 :(得分:2)
其中decltype(fun)
是函数的fun
的类型是函数的类型。虽然使用fun
看起来非常像它应该具有相同的类型,但它实际上不是:你不能拥有一个函数类型的对象,即当作为参数传递时,乐趣的类型恰好是{{ 1}}。如果您将指针滑入实例化(如decltype(fun)*
所示)或在应用foo
bar`之前显式衰减类型),它应该可以工作:
decltype() (as shown for
我意识到有关使用clang的实例化的评论。似乎clang错误地接受了原始代码。