2012-05-14 364 views
0

我試圖通過它們的指針調用函數。編譯這段代碼時,我得到的錯誤是說void類型的表達式不能轉換爲其他類型,但我在調用該函數之前檢查該函數是否返回void或不。有沒有另外一種方法可以實現這個目標?無法從void轉換爲int

class FuncBase { 
public: 
FuncBase(string n, string ret, string arg1, string arg2): name(n), retval(ret), a1(arg1), a2(arg2) {} 
string getName() const { return name; } 
string getRet() const { return retval; } 
string getA1() const { return a1; } 
string getA2() const { return a2; } 
virtual void call() = 0; 

private: 
string name, retval, a1, a2; 
}; 

template <typename ret, typename arg1, typename arg2> 
class Func: public FuncBase { 
public: 
Func(string n, string r, string ar1, string ar2, ret(*fc)(arg1, arg2)): 
       FuncBase(n, r, ar1, ar2), func(fc) {} 
void call() { 
    arg1 ar1; 
    arg2 ar2; 
    cout << "You chose the " << getName() << " function" << endl; 
    cout << "Enter a " << getA1() << ": "; 
    cin >> ar1; 
    cout << "Enter a " << getA2() << ": "; 
    cin >> ar2; 

    if (getRet() != "void") { 
     ret val = (*func)(ar1, ar2); 
     cout << getName() << " returned " << val << endl; 
    } 
    else (*func)(ar1, ar2); 
    cout << endl; 
} 

private: 
// pointer to function 
ret(*func)(arg1, arg2); 
}; 
+3

什麼是'getRet ()'? 'func'在哪裏申報? –

+6

當詢問有關錯誤消息的問題時,請始終發佈確切的錯誤消息以及它所抱怨的行號。 –

+0

我假設'func'是一個返回'void'的類型。即使你「知道」它沒有返回「void」(基於那個「if」),編譯器也會執行嚴格的類型檢查。 –

回答

4

對於模板實例,其中失敗,func是接收兩個參數並具有void返回類型的函數指針。那是retvoid。具有void返回類型的函數不返回任何內容。當然,你不能讀取調用(*func)()的返回值,因爲你說沒有返回值。

即使讀取返回值的分支不會被執行,仍然需要編譯並通過靜態類型檢查。這裏的根本問題是在編譯時處理對*func()的調用,並且需要編譯時靜態類型檢查。

Stack Overflow問題涵蓋了完全相同的問題,因爲你和接受的答案顯示瞭如何處理這個問題

1

我認爲「ARG1」,「ARG2」和「漚」全部爲模板參數。鑑於此,即使代碼的運行時路徑將帶您到(*func)(ar1, ar2),編譯器仍然需要編譯ret val = (*func)(ar1, ar2);,這對於返回void的函數沒有任何意義。我認爲這是給你的錯誤。你能給我們多一點你的代碼嗎?

編輯:好吧,現在我明白你正在嘗試做的,你需要這樣的執行無效,非空功能,具有不同的行爲對每個:

int foo(){ return 5; } 
void bar(){} 

struct executor 
{ 
    template <typename T> 
    void exec(T (*func)()) 
    { 
     T ret = (*func)(); 
     cout << "Non-void function called, returned " << ret << endl; 
    } 

    void exec(void (*func)()) 
    { 
     (*func)(); 
     cout << "void function called" << endl; 
    } 
}; 

int main() 
{ 

    executor ex; 
    ex.exec(foo); 
    ex.exec(bar); 

    return 0; 
} 
相關問題