2015-08-17 2 views
0

Работает одна версия моего кода. Другой (который, как я думал, был бы предпочтительнее) не смог скомпилировать. Если я объявляю простую пару функций:синтаксис для передачи указателя на шаблонную функцию

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 (*)())’ 

Итак, я понимаю, что я не понимаю что-то о синтаксисе использования шаблонов.

+4

Возможно, вы пропустили его, но когда он «работал» в первой попытке, 'T' не был' double', а 'double()'. Вы можете видеть это в сообщении об ошибке. Параметр '()' после '(*)' был передан в 'T'. Вы хотите их использовать в объявлениях параметров, так что 'T' потребляет только' double'. –

+0

Ах, ха! Да, это абсолютно так. Спасибо @ JohannesSchaub-litb! – gleedadswell

ответ

0

Изменить определение как

template<class T> 
void pass_function(T (*func)()) 
{ 
    cout << func() << endl; 
} 

В противном случае, если вы явно указать аргумент шаблона функция специализирована как

void pass_function(double *); 
Смежные вопросы