无法推断出模板类型

use*_*212 2 c++ templates

我有一个(简化的)函数Foo

template<typename It, typename T>
void Foo(It begin, It end, T&& CallBar)
{
    CallBar(begin, end);
}
Run Code Online (Sandbox Code Playgroud)

另一个简化的功能吧

template<typename It>
It Bar(It begin, It end)
{
    return begin;
}
Run Code Online (Sandbox Code Playgroud)

当我以下列方式调用这两个函数时

std::vector<int> v{ 3, 8, 2, 5, 1, 4, 7, 6 };
Foo(v.begin(), v.end(), Bar);
Run Code Online (Sandbox Code Playgroud)

我收到了错误

'声明':无法推断'标识符'的模板参数

还有什么我需要指定才能编译?

Nat*_*ica 6

这里的问题是,因为它Bar是一个功能模板,它不知道Bar你想要的是什么.你必须告诉它使用什么版本Bar.一种方法是指定模板类型.你可以这样做:

Foo(v.begin(), v.end(), Bar<decltype(v.begin())>);
Run Code Online (Sandbox Code Playgroud)

如果你不想指定模板类型,说实话,有点脆,那么我们可以将调用包装Bar在lambda中.这将允许编译器为我们执行所有类型扣除,这更容易维护.例如,如果您更改迭代器类型,则无需更改以前的解决方案.由于0x499602D2这将是

Foo(v.begin(),v.end(),[](auto b,auto e){return Bar(b,e);})
Run Code Online (Sandbox Code Playgroud)