簡體   English   中英

無法從void轉換為int

[英]Cannot convert from void to int

我試圖通過它們的指針來調用函數。 編譯此代碼時,出現錯誤,指出無法將類型為void的表達式轉換為其他類型,但是在調用函數之前,我先檢查函數是否返回void。 我還有另一種方法可以做到這一點嗎?

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);
}; 

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

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

堆棧溢出問題涵蓋了與您完全相同的問題,並且可接受的答案顯示了如何處理該問題

我假設'arg1','arg2'和'ret'都是模板參數。 鑒於此,即使代碼會將您帶到運行時路徑(*func)(ar1, ar2) ,編譯器仍必須編譯ret val = (*func)(ar1, ar2); ,對於返回void的函數沒有意義。 我認為這是給你的錯誤。 您能否為我們提供更多代碼?

編輯:好的,現在我知道了您要做什么,您將需要執行以下操作來執行void和non-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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM