1

使用 Visual Studio (Nov '12 CTP) 编译一些代码时出现此错误:

1>c:\users\*\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\main.cpp(19): error C2893: Failed to specialize function template 'unknown-type locked_call(Lockable &,Callable,Args &&...)'
1>          With the following template arguments:
1>          'std::mutex'
1>          'main::<lambda_d4c412a6f5bd8d382f54c74dc3b1ff5d>'
1>          ''

这是我的功能的一个简短示例:

#include <mutex>
#include <utility>

template <class Lockable, class Callable, typename... Args>
auto locked_call(Lockable &mtx, Callable fn, Args &&... args)
    -> decltype(fn(std::forward<Args>(args)...))
{
    std::lock_guard<Lockable> hold(mtx);
    return fn(std::forward<Args>(args)...);
}

int main()
{
    std::mutex mtx;

    locked_call(mtx, [&] {
    });
}

所以我的问题是:为什么这不能编译?VS11 支持尾随返回类型、可变参数模板和 decltype,但编译器似乎无法获取函数调用的结果类型。

4

0 回答 0