Я использую Visual C++ 2012. Я хочу параметризовать функцию шаблона указателем на другую функцию. Все это прекрасно работает за пределами класса:Указатель на член в качестве аргумента шаблона
int add(int a, int b) {
return a + b;
}
typedef int (*func)(int a, int b);
template<func F> int do_it(int a, int b) {
return F(a, b);
}
int foo(int a, int b) {
return do_it<add>(a, b);
}
Visual C++ 2012 компилирует и оптимизирует это прекрасно.
Теперь, я положил его в класс и настроить его для указателя на член:
struct S {
int add(int a, int b) {
return a + b;
}
typedef int (S::*func)(int a, int b);
template<func F> int do_it(int a, int b) {
return F(a, b); // <-- here be error!
}
int foo(int a, int b) {
return do_it<&S::add>(a, b);
}
};
S s;
int bar(int a, int b) {
return s.foo(a, b);
}
Но это дает мне компилятор ошибки:
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.51106.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
x2.cpp
x2.cpp(7) : error C2064: term does not evaluate to a function taking 2 arguments
x2.cpp(10) : see reference to function template instantiation 'int S::do_it<int S::add(int,int)>(int,int)' being compiled
Любая идея, почему и как Исправить это?
думать о функции-члене класса С, принимая аргументы типа А и В, как же, как и свободная функция принимает 3 аргумента, один из типа С, другой тип A и другое типа B. Ключевое слово «this» означает указатель на этот скрытый объект типа C. – brunocodutra