我有一个(简化的)函数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)
我收到了错误
'声明':无法推断'标识符'的模板参数
还有什么我需要指定才能编译?
这里的问题是,因为它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)
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |