有人可以帮助我理解为什么下面的代码无法编译。
#include <iostream>
#include <vector>
template<typename T, T::size_type* = nullptr>
void foo(T &&val)
{
for(auto elem: val)
{
std::cerr<<elem<<", ";
}
std::cerr<<std::endl;
}
int main()
{
std::vector<int> v = {1,2,3};
foo(v);
return 0;
}
它给出以下错误
错误:‘std::vector&’不是类、结构或联合类型
我尝试添加类型名称,但遇到了同样的错误
template<typename T, typename T::size_type* = nullptr>
如果我将
foo(T &&val)
的签名更改为 void foo(const T &val)
,它就会开始工作
调用
foo(v);
导致在这里推论 T
:
template<typename T, T::size_type* = nullptr>
到
std::vector<int> &
(不是std::vector<int>
)。
您会收到错误,因为 std::vector<int> &::size_type
无效。
要修复此问题,请将行更改为:
template<typename T, std::remove_reference_t<T>::size_type* = nullptr>