Pre-typedef'ing аргумент указателя переменной-функции
У меня есть функция foo
, которая принимает указатель на переменную функцию в качестве аргумента.
Я хотел бы использовать "using" для определения типа аргумента до объявления функции.
template <typename ... vARGS>
using TFuncType = void(*)(vARGS ... V_args);
template <typename ... vARGS>
void foo(TFuncType<vARGS ...> funcptr) {}
void bar(int i) {}
int main() {
foo(&bar); // This line fails to compile.
}
Это не компилируется. Ошибка (через clang с использованием С++ 1z):
/make/proj/test/variadic-funcparam-deduce2.cpp:39:5: error: no matching function for call to 'foo'
foo(&bar);
^~~
/make/proj/test/variadic-funcparam-deduce2.cpp:33:36: note: candidate template ignored: substitution failure [with vARGS = int]
template <typename ... vARGS> void foo(TFuncType<vARGS ...> funcptr) {}
Почему происходит сбой "int"?
Я могу успешно скомпилировать, если я явно напишу тип внутри foo():
template <typename ... vARGS>
void foo(void(*funcptr)(vARGS ... V_args)) {}
Но я не могу заставить начальную ( "использующую" ) версию работать даже при явном указании параметров шаблона и использовании предварительно заданного TFuncType<int>
для аргумента, т.е.
int main() {
TF_call<int> fptr = &bar; // This line is OK.
foo<int>(fptr);
}
Кто-нибудь знает, что здесь?
Есть ли что-то странное в использовании переменных typedef'd ( "using" ) и/или указателей функций, которые мне не хватает?
Ответы
Ответ 1
Я считаю, что это может быть связано со следующим текстом, который я скопировал из этого ответа, который сам берет из стандарта С++ в пункте 14.5.7 [temp.alias] 2:
Когда идентификатор шаблона относится к специализации шаблона псевдонимов, это эквивалентно ассоциированному типу, полученному заменой его шаблонные аргументы для параметров шаблона в идентификаторе типа шаблон псевдонима. [Примечание. Имя шаблона псевдонима никогда не выводится. - end note]
Если я интерпретирую это право, это означает, что GCC, принимающий код, фактически несоответствует.