Попробуйте
auto p = static_cast<void(*)()>(& h<int>);
Поскольку gcc рассматривает шаблонную функцию как перегруженную.С точки зрения gcc, похоже, у вас есть h(int param)
и h(float param)
- какой компилятор выбрать?
Я заметил, в чем проблема в более старых версиях gcc, но я попробуюобъяснить это более многословно.GCC не смог определить тип, потому что шаблонная функция была обработана как перегруженная.По сути, это выглядело так:
void h(int)
{
}
void h(float)
{
}
void (*p)(int) = & h; //ok
void (*p)(float) = & h; //ok
auto p = & h; //error: which version of h?
Для gcc h<int>
было похоже на перегруженную h
функцию с бесконечными альтернативами в зависимости от параметра T
.С кодом, предоставленным в вопросе, можно было сделать следующее:
void (*p)() = & h<int>;
(вот почему я не получаю определение типа "обходной путь")
Как я и думал, OP хотелиспользуя ключевое слово c ++ 11 auto
, как предложено тегом, я статически приводил h<int>
к void(*)()
, что является своего рода бездействием, просто для того, чтобы обмануть gcc, потому что он не мог работать с шаблонными функциями иauto
правильно.
Функции void h<int>()
и void h<float>()
должны, конечно, рассматриваться как разные функции с одним и тем же типом указателя, а не как перегруженные версии функции h
.При создании экземпляра они должны вести себя как void hInt()
и void hFloat()
, и вы должны иметь возможность использовать auto как здесь:
void hInt()
{
}
void hFloat()
{
}
auto p = hInt;
p = hFloat;
Но по какой-то причине для gcc они походили на перегруженные версии h
.
Пожалуйста, укажите причину отрицательных голосов.