1

为什么这段代码失败了

错误 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;
}

(现场示例

4

3 回答 3

8

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

于 2013-04-05T10:24:23.577 回答
2

问题是

makeAndProcessObject (const Builder& builder) receives a const builder

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

int makeObject() const
{
    return 22;
}
于 2013-04-05T10:26:57.663 回答
2

由于 makeAndProcessObject 函数采用常量引用对象,因此它无法访问非常量成员函数(builder.makeObject())。将 makeObject() 转换为常量成员函数 [Ex :int makeObject() const] 或在 builder.makeObject() 模板函数中使用非常量对象 [例如:makeAndProcessObject (Builder& builder)]

问候, 希瓦库玛

于 2013-04-05T11:42:38.317 回答