2012-03-02 2 views
0

NS-3 API의 일부에서 이상한 오류가 발생합니다. 에 따라, 나는 그것이 GetAttribute(std::string)const 기능이 아니라는 사실과 함께해야 할 것 같아요'std :: string GetAttribute (std :: string)'의 'this'인수로 'const link'를 전달하면 한정자가 삭제됩니다.

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

: 여기 내 오류 메시지입니다 :

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

그리고 여기에 문제를 일으키는 코드입니다 documentation for TopologyReader::Link이고 다른 함수 인 GetFromNodeName(void)GetToNodeName(void)const 함수로 선언됩니다. 그러나이 문제를 해결하는 방법을 잘 모르겠습니다.

편집 : (링크 된 문서에서) 같이 함수 서명은 다음과 같습니다

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가 아닌 개체를 가져 와서 함수를 호출하는 방법을 찾아야합니다. 어쩌면 iterConstLinksIterator 대신 LinksIterator으로 선언 할 수 있습니다.

마지막 수단으로 const_cast을 사용하여 컴파일러에게 const 개체 대신 non-const 메서드를 호출하는 것이 안전하다는 것을 알릴 수 있습니다.

+0

'LinksIterator'가 정의되지 않았기 때문에'const_cast' 메소드를 사용해야 할 것입니다. 어떻게해야합니까? 함수를'const' 함수로 변환해야합니까? (나는 C++을 처음 접하다.) – kibibyte

+1

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

+0

오, 그건 꽤 무시 무시한 구문입니다. 하지만 지금은 효과가 있습니다. 감사! – kibibyte