compilar - codigo fuente c++ ejemplos
error de compilador esperado especificador de nombre anidado (3)
Soy el OP para la pregunta: Extender una clase en la que recibí una excelente respuesta. Sin embargo, cuando trato de compilar el código (revisado ligeramente para mi proyecto) recibí el siguiente mensaje (número de línea cambiado para reflejar el siguiente código de muestra):
except.h: | 09 | expected nested-name-specifier before ‘handler_t1’
junto con muchos más que parecen provenir de esta línea. Soy nuevo para C ++, y mi investigación sobre la respuesta (y el próximo problema) ha arrojado este hecho: el compilador de Microsoft parece aceptar el código, pero los que cumplen con los estándares no lo hacen.
El código como lo tengo actualmente es el siguiente:
#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 del código en la pregunta vinculada me indica (con mi conocimiento limitado) que todo debería funcionar.
Mi pregunta por lo tanto es: ¿Qué necesito cambiar en esta declaración / definición para permitir que esto se compile con gcc (4.6.3 compilación de linux de 64 bits con -std = C ++ 0x)?
Con g ++ antes de la versión 6 necesita la opción --std=c++11
para poder usar la directiva using
.
GCC 4.6.3 no es compatible con alias de tipo C ++ 11: using handler_t1 = bool (*)(except::Logic const&);
. Los alias de tipo no plantilla son equivalentes a typedefs: typedef bool (*handler_t1)(except::Logic const&);
. Reemplazarlos y ver si eso ayuda.
O mejor aún, actualice a una versión más reciente del compilador. Creo que los que responden regularmente aquí tienden a escribir en la parte del idioma compilada por GCC 4.8.
EDITAR: La única característica dudosa que veo en esa respuesta está basada en el rango, y creo que GCC agregó soporte en 4.6. Debería estar bien después de reemplazar los alias de tipo con typedefs.
También tuve el mismo problema y lo resolvió simplemente al actualizar G ++ 4.8 en mi Ubuntu.
Supongo que ya tiene una versión anterior de gcc, la forma más fácil podría ser agregar PPA a sus repositorios y actualizar y actualizar puede tener la última versión sin preocupaciones:
sudo add-apt-repository ppa: ubuntu-toolchain-r / test
sudo apt-get update
esto agregará el nuevo PPA a las otras fuentes.
A continuación, deshaga la alternativa:
sudo update-alternatives --remove-all gcc
sudo update-alternatives --remove-all g ++
entonces:
sudo apt-get install gcc-4.8
sudo apt-get install g ++ - 4.8
y como los paquetes alternativos instalan:
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 cambie la versión --version;)