¿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 ')' antes de 'v'
19 | parse_stream<T>(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<typename R>
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).
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 plantillaT
en el constructor. Para resolver el problema, se debe eliminar la declaración del parámetroT
, dejando solo el parámetroR
. El código corregido debería lucir así:No está claro qué causó este problema o si es un error del compilador, como sugiere la publicación original.