pasando 'const Enlace' como 'este' argumento de 'std::string GetAttribute(std::string)' descartes calificadores
Pregunta
Me estoy poniendo un extraño error con las partes de la NS-3 de la API.Aquí está mi mensaje de error:
error: passing ‘const ns3::TopologyReader::Link’ as ‘this’ argument of ‘std::string ns3::TopologyReader::Link::GetAttribute(std::string)’ discards qualifiers
Y aquí está el código de la causa del problema:
TopologyReader::ConstLinksIterator iter;
int num = 0;
for (iter = topologyReader->LinksBegin (); iter != topologyReader->LinksEnd(); iter++, num++)
{
std::istringstream fromName(iter->GetFromNodeName ());
std::istringstream toName (iter->GetToNodeName ());
iter->GetToNodeName();
std::string w = "Weight";
std::string weightAttr = (iter)->GetAttribute(w); // <- error
/* snip */
}
Creo que podría tener que ver con el hecho de que GetAttribute(std::string)
no es un const
función, de acuerdo a la documentación para TopologyReader::Link, mientras que las otras funciones, GetFromNodeName(void)
y GetToNodeName(void)
se declaran como const
funciones.Sin embargo, no estoy seguro de cómo solucionar este problema.
Editar:La función de firmas como se muestra (a partir de la documentación vinculada):
std::string ns3::TopologyReader::Link::GetFromNodeName (void) const
std::string ns3::TopologyReader::Link::GetToNodeName (void) const
std::string ns3::TopologyReader::Link::GetAttribute (std::string name)
Solución
Su análisis es correcto.La obvia solución es hacer GetAttribute
ser una constante de la función.Su nombre lo sugiere debe se const.Es posible que no esté en su poder para cambiar ese código, sin embargo.
La alternativa es encontrar la manera de llegar a un no-const objeto para llamar a la función.Tal vez usted podría declarar iter
como LinksIterator
en lugar de una ConstLinksIterator
.
Como último recurso, usted podría tratar de usar const_cast
para indicar al compilador que es realmente seguro para llamar a un no-const método en un supuesto objeto const.