Специализация шаблона функции вызова с использованием соглашений о вызовах C

У меня есть следующий шаблон

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, а есть только тип.

Кто-нибудь может это объяснить?

14
задан Johannes Schaub - litb 8 April 2011 в 03:51
поделиться