2012-11-03 20 views
7

Czekam na zadeklarowanie typu zewnętrznego wskaźnika funkcji "C". Jest to zmienna składowa. Składnia w this question Nie mogę skompilować.Jak zadeklarować członka jako wskaźnik do zewnętrznej funkcji "C"?

template<typename Sig> struct extern_c_fp { 
    extern "C" typedef typename std::add_pointer<Sig>::type func_ptr_type; 
}; 

Mam eksperymentował z umieszczeniem extern "C" na obu końcach, a między typedef i typename oraz między type i func_ptr_type, ale kompilator odrzucić wszystko. Jakieś sugestie?

+0

Dzięki szablonom aliasów "extern" C, to działałoby. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1463 –

+2

BTW Potrzebujesz 'Sig' by być" zewnętrznym "C" '. Dodawanie wskaźnika do typu funkcji nie ma powiązania. To jest sam typ funkcji. Podczas tworzenia typu funkcji wywołujesz powiązanie. Nie podczas nazywania istniejącego typu funkcji - istniejący typ ma powiązanie, które ma. –

+0

http://liveworkspace.org/code/768027ef00bb0a31e76d8d856ac50801 Narzeka mniej, ale nadal jest problematyczna. – Puppy

Odpowiedz

1
extern "C" { 
    template<typename R, typename... Args> 
    using extern_c_fp = R(*)(Args...); 
} 

using my_function_ptr = extern_c_fp<void, int, double>; 
// returns void, takes int and double 

nie korzystają z tego samego interfejsu, jak używać, ale nie może być sposobem na wyodrębnienie rodzaju powrót i argumentów rodzaje Sig.

To działa w brzęku 3.1. Xeo wskazał na it didn’t work in GCC. Nie jestem pewien, czy jest to błąd w obu kompilatorach, więc należy zachować ostrożność podczas korzystania z tego.

0

Nie można zadeklarować typedef takiego (od 7.5p4):

wiązanie-specyfikacja może nastąpić wyłącznie w zakresie przestrzeni nazw (3.3).