2011-09-19 87 views
1

在我FileProc類,我有四個功能:子類遞歸方法調用

ReadFile(TemplateList<char> &ReadList){} 
ReadFile(TemplateListAdv<char> &ReadList){} 
ReadFile(CharList &ReadList){} 
ReadFile(CharListAdv &ReadList){} 

這些都是應該調用一個集中的方法(它們轉換成):

ReadFile(TemplateListEditor<char> &ReadList){} //Contained by FileBasic 

有關背景信息類的層次結構如下:

TemplateList - > CharList
TemplateLis筆 - > TemplateListAdv
CharList - > CharListAdv
TemplateList - > TemplateListEditor
FileBasic - > FileProc

我的問題是有一個遞歸函數調用(其中TemplateList轉換成TemplateListEditor將保持調用TemplateList功能)儘管這些課程在內部是不同的。類型轉換似乎不起作用。如果沒有重新命名函數(這將會失敗,因爲它應該是通用的),我該如何使該方法查找正確的方法?

(我很驚訝編譯器從來沒有標記出歧義解決方法錯誤)。

例子:

const bool ReadFile(TL::TemplateList<char> &ReadList, const bool Recursion = false) 
{ 
    printf("Is recursion true? %d!\n",Recursion); 
    TL::TemplateListEditor<char> Temp(ReadList); 

    //Calls itself instead of 
    //const bool ReadFile(TL::TemplateListEditor<char> &ReadList, const bool Recursion = false) 
    if(!ReadFile(static_cast<TL::TemplateListEditor<char> &>(Temp),true)) 
    { 
     return false; 
    } 
    return true; 
} 

上面會輸出繼電器:

是遞歸真的嗎? 0
遞歸是真的嗎? 1
遞歸是否正確? 1

這令我TemplateListEditor(儘管是靜態鑄造等等等等),以某種方式或一些令人震驚的原因,被轉換回TemplateList。編輯的構造函數都是明確的。

+1

你能舉一個你的意思嗎? –

+0

嵌入它有點困難。我會盡力。但基本上,編譯器以某種方式將TemplateListEditor翻譯成TemplateList ... aha ...複製構造函數不是顯式的......我希望它們不是......(對不起,它們是明確的,同樣的問題。 ) – SSight3

回答

1

你的問題不是很清楚。但我假設你有這樣的事情:

class A { ... }; 
class B : public A { ... }; 

void readFile(A &a) { ... }; 

void readFile(B &b) 
{ 
    readFile(b); // Recursive call 
    readFile(static_cast<A&>(b)); // Non-recursive call 
} 

函數重載是在編譯時而不是運行時確定的。編譯器嘗試根據參數的類型靜態來查找最佳匹配。

+0

謝謝。這就是我的意思。我試圖製作示例代碼,但它的行爲不像FileProc類中的問題。但這就是我的意思。是。謝謝。 – SSight3

+0

基本上,B正被傳遞給期望B的函數,但B正被轉換爲A,A調用將A轉換爲B的A函數,以便它可以調用B函數(它自己循環)。轉換是隱含的,所以我不知道如何讓它做到正確。 Arrgggh壓力。 – SSight3

+0

對不起,Oli,static_cast(像typecast)沒有爲我工作。它仍然將TemplateListEditor轉換爲TemplateList。 – SSight3