2013-04-05 34 views
1

爲什麼這個代碼返回值的語法和模板不工作

錯誤C2893失敗:無法專注函數模板'未知類型「 makeAndProcessObject(常量生成器&)」

我使用MSVC2012

class BBuilder 
{ 
public: 
    int makeObject() 
    { 
     return 22; 
    } 
}; 

template <typename Builder> 
auto 
makeAndProcessObject (const Builder& builder) -> decltype(builder.makeObject()) 
{ 
    auto val = builder.makeObject(); 
    // do stuff with val 
    return val; 
} 

int main() 
{ 
    BBuilder myobj; 
    auto retval = makeAndProcessObject(myobj); 

    return 0; 
} 

(住example

回答

8

你的函數makeObject應該是const,因爲你試圖在constant object上調用這個函數,然後全部工作。 example

2

問題是

makeAndProcessObject (const Builder& builder) receives a const builder 

但makeObject()函數不是const的!!因此它不能推斷回報...... 您可以刪除const限定符或使makeObject常量,因此它可以找到函數:

int makeObject() const 
{ 
    return 22; 
} 
2

因爲makeAndProcessObject功能正在不斷的參考對象,因此它不能訪問非固定成員函數(builder.makeObject())。無論哪種轉換makeObject()以恆定成員函數[例:INT makeObject()const的]或在builder.makeObject()模板函數使用非恆定對象[例如:makeAndProcessObject(生成器&助洗劑)]

問候, Shivakumar宣讀