Это дополнительный вопрос к ответу на Можно ли в шаблоне определить тип функции указатель-на-внешний-C?
Этот код не может быть скомпилирован с g++
, Visual C / C ++ и Comeau C / C ++ с в основном тем же сообщением об ошибке:
#include <cstdlib>
extern "C" {
static int do_stuff(int) {
return 3;
}
template <typename return_t_, typename arg1_t_>
struct test {
static void foo(return_t_ (*)(arg1_t_)) { }
};
}
int main()
{
test<int, int>::foo(&do_stuff);
return EXIT_SUCCESS;
}
g ++ говорит "ошибка": template with C linkage ", Visual C / C ++ выдает ошибку компилятора C2894 , и Comeau C / C ++ говорит" error: это объявление не может иметь внешнюю связь "C" ".
дело в том, что все довольны:
#include <cstdlib>
extern "C" {
static int do_stuff(int) {
return 3;
}
struct test {
static void foo(int (*)(int)) { }
};
}
int main()
{
test::foo(&do_stuff);
return EXIT_SUCCESS;
}
Раздел 7.5, Спецификации связывания, Стандарт C ++ гласит:
Связывание языка AC игнорируется для имен членов класса итип функции-члена функций-членов класса.
И это даже дает пример:
extern "C" {
class X {
void mf(); // the name of the function mf and the member
// function's type have C++ language linkage
void mf2(void(*)()); // the name of the function mf2 has C++ language
// linkage; the parameter has type pointer to C function
};
}
Если шаблоны допускались во внешних блоках "C", то функции-членыэкземпляры будут иметь связь C ++.
Почему тогда глава 14, Шаблоны, оf Стандартное состояние C ++ 98:
Имя шаблона может иметь связь (3.5).Шаблон, явная специализация шаблона (14.7.3) и частичная специализация шаблона класса не должны иметь связи C.
Что означает, что шаблон "может" иметь связь?Что такое связь с шаблоном?
Почему явно запрещено иметь шаблон с связью C, когда с классом все в порядке и все функции-члены экземпляров шаблона (конструктор по умолчанию, деструктор и перегрузка оператора присваивания)) будет иметь связь C ++?