es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué algunos códigos plantilla no logran compilar con MinGW-64 gcc versión 11.2.0?

Eres un traductor de español que traduce documentos de IT. Traduce lo siguiente al español. No traduzcas el código y la salida en markdown.

Específicamente, es un extracto de https://github.com/dillonhuff/gpr que no se compila en la línea con la definición del constructor parse_stream:


<h1>include "parser.h"</h1> <h1>include <algorithm></h1> <h1>include <fstream></h1> <h1>include <iostream></h1> <h1>include <sstream></h1> <h1>include <streambuf></h1> <p>using namespace std;</p> <p>namespace gpr {</p> <p>template<typename T> struct parse<em>stream { size</em>t i; vector<T> s;</p> <pre><code>template<typename R> parse_stream<T>(R v) : s(v.begin(), v.end()) { // ERROR DE COMPILACIÓN: se esperaba ')' antes de 'v' i = 0; } </code></pre> <p>(...) }

y parser.h solo contiene esto:


<h1>pragma once</h1> <h1>include <string></h1> <h1>include "gcode_program.h"</h1> <p>namespace gpr {</p> <p>std::vector<std::string> lex<em>block(const std::string& block</em>text);</p> <p>gcode<em>program parse</em>gcode(const std::string& program_text);</p> <p>gcode<em>program parse</em>gcode<em>saving</em>block<em>text(const std::string& program</em>text);</p> <p>}

Esto solía compilar perfectamente con MSVC 2019, y hace poco tiempo con una versión inferior del compilador gcc MinGW-64. Parece tener algo que ver con la versión del estándar de C++ (17 vs 20), ya que al reducir la configuración de la versión de C++ en el archivo .pro de Qt parece solucionarlo (pero luego pierdo .contains() de std::map y algunas otras funciones).

Tal vez estoy ciego, pero simplemente no veo qué está mal aquí. Por favor, ayuda.

EDITAR: Agregando un error de compilación exacto

../gpr/src/parser.cpp:19:22: error: se esperaba &#39;)&#39; antes de &#39;v&#39;
   19 |     parse_stream&lt;T&gt;(R v) : s(v.begin(), v.end()) {
      |                    ~ ^~
      |                      )

EDITAR: El comentario de NathanOliver ayuda a resolver la compilación. Se compila (sin la declaración del parámetro T):

template&lt;typename R&gt;
    parse_stream(R v) : s(v.begin(), v.end()) { // ¡AHORA FUNCIONA!
      i = 0;
    }

(No estoy seguro si es una solución o una solución provisional para un error del compilador, ya que la pregunta principal sigue sin respuesta).

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El código proporcionado contiene un error de sintaxis en la definición del constructor de la estructura parse_stream. Específicamente, el error se produce por la forma en que se especifica el parámetro de plantilla T en el constructor. Para resolver el problema, se debe eliminar la declaración del parámetro T, dejando solo el parámetro R. El código corregido debería lucir así:

    template<typename r="">
    parse_stream(R v): s(v.begin(), v.end()) {
        i = 0;
    }
    

    No está claro qué causó este problema o si es un error del compilador, como sugiere la publicación original.

Comments are closed.