Код
void invoke(T argument) {
fPtr(argument); // <-- VC++ error C2064: Expression does not evaluate to a function call, ok for gcc (Q1)
}
Неправильно сформирован.Вам нужен объект для вызова функции-члена, а у вас его нет здесь.Причина, по которой вы видите ошибку в MSVC, но не в GCC, скорее всего, связана с разницей в обработке шаблона.Полный код необходим, чтобы указать точную причину, но это, вероятно, было бы спорным упражнением - независимо от внешнего вида, код плох для любого компилятора и должен быть исправлен.
Второй код
Action<double, C> dblAction = Action<double, C>("x", &C::dummyDbl);
выглядит как ошибка в gcc5, правильно компилируется в gcc6.Он также правильно компилируется в CLang, так как 3.4.1
Этот код компилируется везде:
A<double, C> dblAction{"x", &C::dummyDbl};
Извините, вопрос 3 неясен, и лучший формат для SO - one вопрос за пост.Поэтому я предлагаю разделить вопрос 3 на отдельный пост.