Работает одна версия моего кода. Другой (который, как я думал, был бы предпочтительнее) не смог скомпилировать. Если я объявляю простую пару функций:синтаксис для передачи указателя на шаблонную функцию
template<class T>
void pass_function(T (*func))
{
cout << func() << endl;
}
double func_to_pass()
{
return(0);
}
Я могу назвать
pass_function(&func_to_pass);
и все работает, как ожидалось. Я знаю, что это «выяснение», что шаблон стоит здесь вдвое, хотя я не сказал ему, что он является двойным в этом вызове.
Но если вместо этого я называю
pass_function<double>(&func_to_pass);
я наивно было бы думать, что это будет лучше, так как я пытаюсь сказать ему, что функция передается в качестве аргумента будет возвращать в два раза. Но я получаю сообщение об ошибке:
error: no matching function for call to ‘pass_function(double (*)())’
Итак, я понимаю, что я не понимаю что-то о синтаксисе использования шаблонов.
Возможно, вы пропустили его, но когда он «работал» в первой попытке, 'T' не был' double', а 'double()'. Вы можете видеть это в сообщении об ошибке. Параметр '()' после '(*)' был передан в 'T'. Вы хотите их использовать в объявлениях параметров, так что 'T' потребляет только' double'. –
Ах, ха! Да, это абсолютно так. Спасибо @ JohannesSchaub-litb! – gleedadswell