У меня есть следующий шаблон
template<typename T> void f(T t) { }
И я хочу передать адрес его конкретной специализации функции C
g(&f<int>);
Но поскольку я хочу быть переносимым, я хочу соглашение о вызовах "f", чтобы соответствовать соглашению о вызове C. что, как я понимаю, означает, что он жалуется на тип функции шаблона функции. И на самом деле, я нашел спецификацию, которая гласит:
Шаблон, явная специализация шаблона (14.7.3) и частичная специализация шаблона класса не должны иметь связи C
. Теперь для меня очевидно, что у нас нет хотите изменить связь name , потому что мы полагаемся на искажение для работы. Но в чем причина запрета изменять привязку типа ? Кажется, это ограничивает нас использованием соглашения о вызовах C ++; знает ли кто-нибудь причину и есть ли простой обходной путь для достижения моей первоначальной цели?
Я изменил способ, которым я пытаюсь связать только тип сейчас, следующим образом
extern "C" typedef void ftype(int);
template<typename T>
ftype f;
И это отлично работает. К сожалению, я не вижу способа определить f
при использовании этой техники. Но в любом случае ни один компилятор, который я пробовал, не диагностирует это (пробовал EDG / comeau, GCC и clang), хотя это выглядит точно так же, как и раньше: имя не должно иметь связи с языком C, а есть только тип.
Кто-нибудь может это объяснить?