Quiero agregar un typedef
público a una plantilla para un puntero a una función que toma un argumento que usa un enlace de lenguaje "C".¿Es posible escribir un tipo de función de puntero a externo? "C" dentro de una plantilla?
me trataron:
extern "C" {
template <typename return_t_, typename arg1_t_>
struct test
{
typedef return_t_ (*C_fun1_t)(arg1_t_);
};
}
Y:
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" {
typedef return_t_ (*C_fun1_t)(arg1_t_);
}
};
Y:
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" typedef return_t_ (*C_fun1_t)(arg1_t_);
};
sin éxito.
¿Lo que intento lograr es posible?
¿No es esto lo que hace que toda la C "externa" pueda usar una convención de llamadas diferente "una de esas cosas molestas que tienes que explicar pero que seguramente nunca pasará? Los tipos de puntero a función no distinguen entre los dos, porque 'extern" C "' no es parte del sistema de tipo, es un especificador de enlace. Esto significa que las llamadas a través del puntero creado * desde C++ * funcionarán independientemente de si la referencia del puntero es 'extern' C "' o no. Son llamadas realizadas desde C que pueden fallar, pero el sistema de tipos no lo comprueba. –
@Steve: It * is * parte del sistema de tipo; C++ 03 §7.5p1: "Dos tipos de funciones con enlaces de idiomas diferentes son tipos distintos, incluso si son idénticos". §5.2.2p1: "Llamar a una función a través de una expresión cuyo tipo de función tiene un enlace de lenguaje que es diferente del enlace de lenguaje del tipo de función de la definición de la función llamada no está definida". –
@Fred: oh, OK. Lo siento, no estoy seguro de dónde recogí esa información incorrecta, entonces. Además, si declaro una función externa "C" que toma un puntero a la función como parámetro, ¿toma una función "C" o una función "C++"? Porque g ++ felizmente me permite usar cualquiera de los dos con '-pedantic'. –