Chcę dodać publiczny typedef
do szablonu dla wskaźnika do funkcji biorących jeden argument, który używa powiązania języka "C".Czy możliwe jest wpisanie w szablonie typu wskaźnik-do-zewnętrznego typu "C"?
Próbowałem:
extern "C" {
template <typename return_t_, typename arg1_t_>
struct test
{
typedef return_t_ (*C_fun1_t)(arg1_t_);
};
}
oraz:
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" {
typedef return_t_ (*C_fun1_t)(arg1_t_);
}
};
oraz:
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" typedef return_t_ (*C_fun1_t)(arg1_t_);
};
bez powodzenia.
Czy to, co próbuję osiągnąć, jest możliwe?
Czy to nie to, co sprawia, że całe "zewnętrzne" C "może używać innej konwencji telefonowania", jednej z tych irytujących rzeczy, które musisz wyjaśnić, ale które prawie na pewno nigdy nie będą miały miejsca? Typy wskaźników funkcji nie rozróżniają dwóch, ponieważ 'extern" C "' nie jest częścią systemu typów, jest to specyfikator powiązań. Oznacza to, że wywołania przez wskaźnik wykonany * z C++ * będą działały niezależnie od tego, czy odnośnik wskaźnika jest "zewnętrzny" C ", czy też nie. To wywołania z C, które mogą zawieść, ale system typów nie sprawdza tego dla ciebie. –
@Steve: It * jest * częścią systemu typu; C++ 03 §7.5p1: "Dwa typy funkcji z różnymi powiązaniami językowymi są różnymi typami, nawet jeśli są poza tym identyczne." §5.2.2p1: "Wywołanie funkcji za pomocą wyrażenia, którego typ funkcji ma powiązanie językowe, które różni się od powiązania języka typu funkcji wywołanej definicji funkcji, jest niezdefiniowane." –
@Fred: oh, OK. Niestety, nie jestem pewien, skąd wziąłem te złe informacje. Ponadto, jeśli zadeklaruję zewnętrzną funkcję "C", która sama przyjmie wskaźnik funkcji jako parametr, czy ma funkcję "C" lub funkcję "C++"? Ponieważ g ++ szczęśliwie pozwala mi używać albo z '-pedantic'. –