передача 'const Link' в качестве 'this' аргумента 'std :: string GetAttribute (std :: string)' отбрасывает квалификаторы - PullRequest
0 голосов
/ 02 марта 2012

Я получаю странную ошибку с частями API NS-3. Вот мое сообщение об ошибке:

error: passing ‘const ns3::TopologyReader::Link’ as ‘this’ argument of ‘std::string ns3::TopologyReader::Link::GetAttribute(std::string)’ discards qualifiers

А вот код, вызывающий проблему:

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 */
  }

Я думаю, что это может быть связано с тем, что GetAttribute(std::string) не является функцией const, согласно документации для TopologyReader :: Link , в то время как другие функции, GetFromNodeName(void) и GetToNodeName(void) объявлены как const функции. Однако я не уверен, как решить эту проблему.

Edit: Подписи функций такие, как показано (из связанной документации):

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)  

1 Ответ

1 голос
/ 02 марта 2012

Ваш анализ верен. Очевидное решение - сделать GetAttribute постоянной функцией. Его название предполагает, что должно быть постоянным. Возможно, вам не удастся изменить этот код.

Альтернатива состоит в том, чтобы найти какой-то способ получить неконстантный объект для вызова функции. Может быть, вы могли бы объявить iter как LinksIterator вместо ConstLinksIterator.

В качестве последнего средства вы можете попробовать использовать const_cast, чтобы сообщить компилятору, что действительно безопасно вызывать неконстантный метод для предположительно константного объекта.

...