Consider the following code:
#include <iostream>
struct S {
void f(const char* s) {
std::cout << s << '\n';
}
};
template <typename... Args, void(S::*mem_fn)(Args...)>
void invoke(S* pd, Args... args) {
(pd->*mem_fn)(args...);
}
int main() {
S s;
void(*pfn)(S*, const char*) = invoke<const char*, &S::f>;
pfn(&s, "hello");
}
When compiling the code, clang gives the following error:
main.cpp:16:33: error: address of overloaded function 'invoke' does not match required type 'void (S *, const char *)'
void(*pfn)(S*, const char*) = invoke<const char*, &S::f>
^~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:10:6: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'Args'
void invoke(S* pd, Args... args) {
^
1 error generated.
The message seems to suggest that the template instantiation invoke<const char*, &S::f>
has failed. Could somebody give me some clues as to why is this? I believe it has something to do with the parameter pack.
Aucun commentaire:
Enregistrer un commentaire