Yo soy el OP para la pregunta: Ampliación de una clase en el que he recibido una excelente respuesta. Sin embargo, como voy a tratar de compilar el código (reelaborado ligeramente para mi proyecto) he recibido el siguiente mensaje (línea no. cambiado para reflejar el siguiente código de ejemplo):

except.h: | 09 | expected nested-name-specifier before handler_t1

junto con muchos más que se parecen a la madre de esta línea. Soy nuevo en C++, y mi investigación en la respuesta (y la próxima problema) ha producido este hecho: el de Microsoft compilador parece aceptar el código, pero que cumple con los estándares no.

El código como el que tengo actualmente es como sigue:

#include <vector>
namespace except
{
  //several other classes and functions which compile and work already
  //(tested and verified) have been snipped out. Entire code is over
  //1000 lines.

  class Error_Handler
  {
    public:
      using handler_t1 = bool (*)(except::Logic const&);
      std::vector<handler_t1> logic_handlers;

      //a lot more removed because the error has already happened ...
  }
}

Una lectura a través de el código de los enlaces pregunta me indica (con mis limitados conocimientos) que se debe todo el trabajo.

Mi pregunta por tanto es: ¿Qué necesito cambiar en esta declaración/definición para habilitar esta compilar con gcc (4.6.3 linux de 64 bits compilar con-std=C++0x)?

InformationsquelleAutor Jase | 2014-01-10

3 Comentarios

  1. 7

    GCC 4.6.3 no soporta C++11 alias de tipo: using handler_t1 = bool (*)(except::Logic const&);. No el tipo de plantilla de los alias son equivalentes a las definiciones de tipos: typedef bool (*handler_t1)(except::Logic const&);. Reemplazar con ellos y ver si eso ayuda.

    O mejor aún, la actualización a la más reciente versión del compilador. Creo que el regular los socorristas aquí tienden a escribir en la parte de la lengua compilados con GCC 4.8.

    EDIT: El único dudoso característica veo en esa respuesta es la base para el, que creo que GCC añadido soporte para en 4.6. Usted debería estar bien después de cambiar el tipo de alias con typedefs.

    • Me encontré con la norma respectiva cotización. 7.1.3.2 A typedef-name can also be introduced by an alias-declaration. The identifier following the using keyword becomes a typedef-name and the optional attribute-specifier-seq following the identifier appertains to that typedef-name. It has the same semantics as if it were introduced by the typedef specifier. In particular, it does not define a new type and it shall not appear in the type-id.. También, gcc.gnu.org/gcc-4.6/cxx0x_status.html. Verás un gran rojo no junto a template alises.
    • Muchas gracias. Resuelto todo el problema!
    • Excelente referencia. Siendo nuevo en C++ no tenía ni idea de que diferentes compiladores requiere una sintaxis diferente, o se ofrecen diferentes conjuntos de características.
  2. 2

    Con g++ antes de la versión 6 que necesita la opción --std=c++11 a ser capaz de utilizar el using directiva.

    • Esto funcionó para mí. Gracias!
    • Sobre todo porque yo estaba trabajando con una versión superior a la 4.8, pero inferior a 6
  3. 1

    Yo también tengo el mismo problema y lo ha resuelto con sólo actualizar ir G++ 4.8 en mi Ubuntu.

    Supongo que usted ya tiene una versión anterior de gcc, la forma más sencilla podría ser la adición de la PPA para los repositorios y Actualizar y actualizar usted puede tener la última versión sin preocupaciones:

    sudo add-apt-repository ppa:ubuntu-herramientas-r/prueba

    sudo apt-get update

    esto agregará el nuevo PPA a las otras fuentes.

    A continuación, desinstalar la alternativa:

    sudo update-alternatives –remove-todos gcc

    sudo update-alternatives –remove-all g++

    a continuación:

    sudo apt-get install gcc-4.8

    sudo apt-get install g++-4.8

    y como la alternativa de los paquetes a instalar :

    sudo update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20

    sudo update-alternatives –install /usr/bin/g++ g++ /usr/bin/g++-4.8 20

    sudo update-alternatives –config gcc

    sudo update-alternatives –config g++

    al final:

    sudo apt-get update

    sudo apt-get upgrade -y

    sudo apt-get dist-upgrade

    Espero que esto cambia el –versión 😉

Dejar respuesta

Please enter your comment!
Please enter your name here