2012-03-02 3 views
0

Я получаю странную ошибку с частями API NS-3. Вот мое сообщение об ошибке:Передача 'const Link' как 'this' аргумент 'std :: string GetAttribute (std :: string)' отбрасывает квалификаторы

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 функции, в соответствии с documentation for 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) 
+0

Ooops. Я пропустил это, извините. Вы можете сообщить об этом как об ошибке. Это похоже на одно. –

ответ

1

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

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

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

+0

Поскольку 'LinksIterator' не определен, мне нужно пойти с методом' const_cast'. Как мне это сделать? Нужно ли использовать функцию как 'const'? (Я совершенно новичок в C++) – kibibyte

+1

@kibibyte 'const_cast (* iter) .GetAttribute ...' –

+0

О, дорогой, это довольно ужасный синтаксис. Но теперь это работает. Благодаря! – kibibyte

Смежные вопросы