我不明白为什么它不能编译,您能给我一个简单的理由吗?
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
问题是SignalArgs
没有命名功能模板的参数。它只是一个标识符,可以选择在declarator中声明您的实际模板参数。它基本上与声明函数类型的声明器中函数参数的名称相同,例如:]