pre-typedef&一个variadic-function-pointer参数

时间:2015-07-04 23:22:56

标签: c++ templates c++11 function-pointers variadic

我有一个函数foo,它将一个可变参数函数指针作为参数。

我想使用"使用"在函数声明之前定义参数的类型。

template <typename ... vARGS>
using TFuncType = void(*)(vARGS ... V_args);

template <typename ... vARGS>
void foo(TFuncType<vARGS ...> funcptr) {}

void bar(int i) {}

int main() {
  foo(&bar); // This line fails to compile.
}

这不会编译。错误(通过clang使用c ++ 1z)是:

/make/proj/test/variadic-funcparam-deduce2.cpp:39:5: error: no matching function for call to 'foo'
foo(&bar);
^~~
/make/proj/test/variadic-funcparam-deduce2.cpp:33:36: note: candidate template ignored: substitution failure [with vARGS = int]
template <typename ... vARGS> void foo(TFuncType<vARGS ...> funcptr) {}

为什么&#34; int&#34;替换失败了?

如果我在foo()中明确写出类型,我可以成功编译:

template <typename ... vARGS>
void foo(void(*funcptr)(vARGS ... V_args)) {}

但即使明确指定模板参数,并使用预先加载的TFuncType<int>作为参数,我也无法使初始(&#34;使用&#34;)版本工作,即:

int main() {
  TF_call<int> fptr = &bar; // This line is OK.
  foo<int>(fptr);
}

有谁知道这里有什么?

使用typedef&#39; d(&#34;使用&#34;)可变参数和/或我失踪的函数指针是否有些奇怪?

1 个答案:

答案 0 :(得分:1)

我认为这可能与我从this answer复制的以下文本有关,该文本本身取自14.5.7 [temp.alias]第2段中的C ++标准:

  

当template-id引用别名模板的特化时,   它相当于通过替换获得的相关类型   它的模板参数在type-id中的模板参数   别名模板。 [注意:永远不会推断出别名模板名称。 -   尾注]

如果我正确解释该权利,则意味着接受该代码的GCC实际上是不合规的。