2012-07-12 4 views
0

C++ 빌더 5에 wirited 및 컴파일 된 C++ 코드가 있습니다. 하지만이 코드를 C++ 빌더 2009로 업데이트/마이그레이션해야합니다. 그래서, 몇 가지 문제가있다 : 라인에서비 const 함수 _fastcall const 객체를 호출하는 TStrings :: GetCount() const

int __fastcall TAllConversor::ListToStr(
    const TStringList* pList, 
    AnsiString& strValue, 
    const long lngLimiteInferior, 
    const long lngLimiteSuperior) const 
{ 
    long lngIndice; 
    AnsiString strAux; 

    try 
    { 
    if (lngLimiteSuperior == 0) 
     lngIndice = pList->Count; 
    else 
     lngIndice = lngLimiteSuperior + lngLimiteInferior; 

    for (int i = lngLimiteInferior; i < lngIndice; i++) 
    { 
     strAux += pList->Strings[i] + ";"; 
    } 

    strValue = strAux; 
    return 1; 
    } 
    catch(...) 
    { 
    return 0; 
    } 
} 

"lngIndice = pList->을 카운트를;" 이 오류가 발생합니다 : "E2522 비 const 함수 _fastcall TStrings :: GetCount() const 개체가 호출됩니다."

그래서 어떻게 해결할 수 있습니까?

+1

이 코드에서는 "TStrings :: GetCount()"에 대해 본 적이 없습니까? 어디에서 전화 했니? 오류에서, 나는 선언과 함수의 정의가 일치하지 않거나 함수가 const 객체와 함께 호출되지만 이해해서는 안된다. Answer : casting을 사용하십시오. –

+0

아마도 TStringList에 대한 정보가 필요합니다. 잘못된 것일 테니 – Mark

+1

@gcc : TStringList는 VCL 클래스입니다. 'Count' 속성은'GetCount()'메서드를 호출합니다. –

답변

2

TStringList의 정확한 정의를 제공했다면 도움이 될 것입니다.하지만 typename TString에 대한 템플릿이있는 배열이라고 가정합니다.

일이 주위에 같이 const를 멀리 캐스팅 할 수 있습니다 : 그것은 단지 무엇 물론

lngIndice = (const_cast<TStringList*>(pList))->Count; 

- 작업 - 주위에 그리고 당신은 const를-올바른 액세스를 제공하는보고 할 수 있습니다 함수 대신 TString 자체에

+1

'TStringList'가 무엇인지에 대해 잘못 가정합니다. 템플릿 기반 클래스가 아닙니다. 델파이로 작성된 볼랜드 VCL 클래스입니다. 그러나 귀하의 솔루션은 여전히 ​​유효합니다. 'GetCount()'메쏘드는'const'로 선언되지 않았기 때문에 변경 될 수 없습니다. 그래서'pList' 매개 변수는 const_cast를 통해 또는 단순히 'pList' 매개 변수로부터'const' (델파이는 C++과 같이 const-correct가 아닙니다). –

+0

당신은'pList-> Strings []'속성에 접근하는 것과 같은 문제를 겪게 될 것입니다 -'TStrings :: Get()'메소드를 호출합니다.이 메소드는'const'로 선언되지 않기 때문에 제거해야합니다 그 전화에 관한 constness. –