返回值语法和模板不起作用

时间:2013-04-05 10:22:45

标签: c++ c++11

为什么此代码失败

  

错误C2893:无法专门化功能模板''unknown-type'   makeAndProcessObject(const Builder&)'

我正在使用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

3 个答案:

答案 0 :(得分:8)

你的函数makeObject应该是const,因为你试图在constant object上调用这个函数,然后一切正常。 example

答案 1 :(得分:2)

问题在于

makeAndProcessObject (const Builder& builder) receives a const builder

但是makeObject()函数不是const !!所以不能推断回报...... 你可以删除const限定符或make makeObject const,这样就可以找到函数:

int makeObject() const
{
    return 22;
}

答案 2 :(得分:2)

因为makeAndProcessObject函数正在采用常量引用对象所以它无法访问非常量成员函数(builder.makeObject())。将makeObject()转换为常量成员函数[Ex:int makeObject()const]或在builder.makeObject()模板函数中使用非常量对象[ex:makeAndProcessObject(Builder&amp; builder)]

此致 Shivakumar宣读