问题描述
最小示例
#include <vector>
#include <tuple>
template<typename T>
void function(std::vector<T> vec)
{
auto tup = std::tuple<decltype(vec)::iterator>(vec.begin());
}
int main(int argc,char* args[])
{
std::vector<int> vec = {1,2,3};
auto tup = std::tuple<decltype(vec)::iterator>(vec.begin());
function(vec);
return 0;
}
试图编译给出的东西
error: type/value mismatch at argument 1 in template parameter list for ‘template<class ... _Elements> class std::tuple’
auto tup = std::tuple<decltype(vec)::iterator>(vec.begin());
^
note: expected a type,got ‘decltype (vec)::iterator’
here中描述的解决方案建议添加一个typename
。将typename
放在decltype
中的function
前面解决了编译问题。但是:
- 为什么不能推断出类型?
- 潜在的问题是什么? (显然,编译器怀疑decltype(...):: iterator是一种类型。但是为什么它在
main
中有效,但在function
中无效?)
解决方法
由于iterator
是从属名称,因此您需要使用typename
关键字来消除歧义:
auto tup = std::tuple<typename decltype(vec)::iterator>(vec.begin());
// ^^^^^^^^
请注意,vec
只是function
中的从属名称。在main
内部,它不是依赖项,因此您不必说typename
。