¿Usando tipos integrados (doble, int, etc.) en un espacio de nombres de C++?

¿Puedo hacer tipos integrados como int y double disponible en un espacio de nombres de C++?

#include <complex>

typedef int my_int;

namespace my_namespace {
  namespace std = ::std;  // Works
  using ::my_int;         // Works

  using ::int;            // Fails: "expected unqualified-id before 'int'"
  typedef ::int int;      // Fails: "expected unqualified-id before 'int'"
}

typedef int out::int;     // Fails: "expected unqualified-id before 'int'"

my_namespace::my_int x;            // Works
my_namespace::std::complex<int> c; // Works

// I would like to use this:
my_namespace::int x2;    // Fails: "expected unqualified-id before 'int'" 

Sospecho que esto se debe a una limitación de idioma que prohíbe el uso de identificadores calificados con palabras clave en ellos (int en este caso), pero espero que haya alguna forma de exponerlos.

Caso de uso

Estoy tratando de usar espacios de nombres para organizar tipos para que una herramienta externa (TRAGO) puede envolver apropiadamente funciones en otro idioma. Por ejemplo:

void one_two(int &x, int &y) { x = 1; y = 2; }

En el idioma de destino, esto podría envolverse como una función que muta sus argumentos one_two(x, y), o una función que devuelve la salida x, y = one_two(). Me gustaría alguna forma de "anotar" los argumentos para proporcionar TRAGO con el uso previsto. La opción más limpia con la actual TRAGO implementación es usar un espacio de nombres para diferenciar entre los dos usos: por lo tanto, la versión de salida x, y = one_two() se puede denotar::

void one_two(out::int &x, out::int &y) { x = 1; y = 2; }

si de alguna manera pudiera hacer out::int un sinónimo de int. (Este enfoque funciona bien con los tipos definidos por el usuario).

preguntado el 28 de julio de 12 a las 05:07

¿A qué idioma se dirige con SWIG aquí? Muchos de los idiomas de destino facilitan la inserción de este tipo de "definición de tipo fuerte" dentro de la interfaz. -

@Flexo: Python, pero no veo cómo eso ayudará. El objetivo es el código C++ que se puede envolver automáticamente. Necesito proporcionar pistas para SWIG, así que modificando el nombre (OUTPUT en lugar de x que no es indeseable debido a los kwargs) o use un typedef. Él out el espacio de nombres está limpio, pero sería aún mejor si también funcionara para los tipos integrados, lo que creo que no es posible. Ver este hilo. -

1 Respuestas

int y amigos son palabras clave en el idioma. No son nombres en el espacio de nombres global; no son nombres en absoluto en lo que se refiere al idioma. calificándolos con :: es un error Tratando de nombrar cualquier variable int también es un error. Específicamente, consulte el párrafo 2.1 de 1 en C++ 03 y el párrafo 2.12 de 1 en C++ 11 (el texto es el mismo):

The identifiers shown in Table 3 are reserved for use as keywords (that is, they
are unconditionally treated as keywords in phase 7):
[ ... ]
int

Respondido 28 Jul 12, 05:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.