2012-07-12 35 views
0

我有一箇舊的C++代碼,並且編譯進C++ builder 5中。 但是現在,我需要將此代碼更新/遷移到C++ builder 2009。所以,我有一些問題:非常量函數_fastcall 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-> Count;」我得到這個錯誤:「對const對象調用E2522非const函數_fastcall TStrings :: GetCount()」。

那麼,我該如何解決(解決)它呢?

+1

在這段代碼中,我還沒有看到任何關於「TStrings :: GetCount()」?你打了什麼電話?從錯誤,我明白函數的聲明和定義不匹配或用const對象調用函數,但你不應該這樣做。答案:使用Casting – 2012-07-12 13:55:13

+0

我們需要看到一些關於TStringList的信息,因爲這可能是不正確的,那就是代碼改變 – Mark 2012-07-12 13:58:00

+1

@gcc:'TStringList'是一個VCL類。它的'Count'屬性調用'GetCount()'方法。 – 2012-07-12 22:42:38

回答

2

如果你提供了一個TStringList的確切定義會有幫助,但我只是假設它是一個typename TString的模板化數組。

變通可能是丟掉了常量,如:

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

當然這也正是 - 一個變通,你可能想看看提供一個const,正確的訪問函數在TString本身,而不是

+1

你錯誤地假設'TStringList'是什麼。它不是一個模板類。它是Delphi編寫的Borland VCL類。但是你的解決方案仍然有效。 'GetCount()'方法沒有被聲明爲'const'(並且不能被改變),所以'pList'參數需要去除它的常量以避免編譯器錯誤,或者通過'const_cast'或者通過簡單的刪除來自'pList'參數的'const'(Delphi不像C++那樣是常量正確的)。 – 2012-07-12 22:45:51

+0

訪問'pList-> Strings []'屬性時你會遇到同樣的問題 - 它調用'TStrings :: Get()'方法,它也沒有被聲明爲'const',所以你必須刪除該電話的常態也是如此。 – 2012-07-12 22:48:43

相關問題