为模板 类 重载函数模板

问题描述 投票:0回答:1

我不明白为什么它不能编译,您能给我一个简单的理由吗?

template <typename... Args>
class Signal{};

template <template <typename... SignalArgs> class Signal, typename... Args>
void f(Signal<SignalArgs...>&& signal, Args&&... args)
{}

gcc提供的错误是:

error: 'SignalArgs' was not declared in this scope; did you mean 'Signal'?
   11 | void f(Signal<SignalArgs...>&& signal, Args&&... args)
      |               ^~~~~~~~~~
      |               Signal
<source>:11:25: error: expected parameter pack before '...'
   11 | void f(Signal<SignalArgs...>&& signal, Args&&... args)
      |                         ^~~
<source>:11:28: error: template argument 1 is invalid
   11 | void f(Signal<SignalArgs...>&& signal, Args&&... args)
      |       

更重要的是,编写这种重载的正确方法是什么?请注意,我需要f的两个变体-一个有问题,另一个是template <typename F> void f(F&&);我绝对不希望Signal的任何实例(包括Signal<>)进入通用重载。

在Godbolt上在线尝试:https://godbolt.org/z/Xawz6G

c++ templates overloading c++17 variadic-templates
1个回答
2
投票

问题是SignalArgs没有命名功能模板的参数。它只是一个标识符,可以选择在declarator中声明您的实际模板参数。它基本上与声明函数类型的声明器中函数参数的名称相同,例如:]

© www.soinside.com 2019 - 2024. All rights reserved.