C++ 类型推导有问题
运行环境:
Apple clang version 12.0.5 (clang-1205.0.22.9)
以下代码可以正常运行:
#include <vector>
#include <iostream>
using namespace std;
int Print(vector<int>::const_iterator itorStart, vector<int>::const_iterator itorEnd)
{
for(auto itor=itorStart;itor<itorEnd;itor++)
{
cout<<(*itor)<<" ";
}
cout<<endl;
return 0;
}
int Print( vector<int>::const_reverse_iterator itorStart, vector<int>::const_reverse_iterator itorEnd)
{
for(auto itor=itorStart;itor<itorEnd;itor++)
{
cout<<(*itor)<<" ";
}
cout<<endl;
return 0;
}
int main()
{
vector<int> temp{1,2,3,4,5,6,7,8,9};
vector<int>::const_iterator itorB=temp.cbegin();
vector<int>::const_iterator itorE=temp.cend();
vector<int>::const_reverse_iterator itorRB = temp.crbegin();
vector<int>::const_reverse_iterator itorRE = temp.crend();
Print(itorB,itorE);
Print(itorRB,itorRE);
return 0;
}
打印内容符合预期
[Running] cd "/Users/xxx/" && g++ cpp_test.cpp -o cpp_test -std=c++20 && "/Users/xxx/"cpp_test
1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1
[Done] exited with code=0 in 0.339 seconds
以下代码就会报错:
#include <vector>
#include <iostream>
using namespace std;
template <class T1>
int Print(typename vector<T1>::const_iterator itorStart, typename vector<T1>::const_iterator itorEnd)
{
for(auto itor=itorStart;itor<itorEnd;itor++)
{
cout<<(*itor)<<" ";
}
cout<<endl;
return 0;
}
template <class T2>
int Print(typename vector<T2>::const_reverse_iterator itorStart, typename vector<T2>::const_reverse_iterator itorEnd)
{
for(auto itor=itorStart;itor<itorEnd;itor++)
{
cout<<(*itor)<<" ";
}
cout<<endl;
return 0;
}
int main()
{
vector<int> temp{1,2,3,4,5,6,7,8,9};
vector<int>::const_iterator itorB=temp.cbegin();
vector<int>::const_iterator itorE=temp.cend();
vector<int>::const_reverse_iterator itorRB = temp.crbegin();
vector<int>::const_reverse_iterator itorRE = temp.crend();
Print(itorB,itorE);
Print(itorRB,itorRE);
return 0;
}
报错内容如下:
[Running] cd "/Users/xxx/" && g++ cpp_test.cpp -o cpp_test -std=c++20 && "/Users/xxx/"cpp_test
cpp_test.cpp:36:5: error: no matching function for call to 'Print'
Print(itorB,itorE);
^~~~~
cpp_test.cpp:7:5: note: candidate template ignored: couldn't infer template argument 'T1'
int Print(typename vector<T1>::const_iterator itorStart, typename vector<T1>::const_iterator itorEnd)
^
cpp_test.cpp:18:5: note: candidate template ignored: couldn't infer template argument 'T2'
int Print(typename vector<T2>::const_reverse_iterator itorStart, typename vector<T2>::const_reverse_iterator itorEnd)
^
cpp_test.cpp:37:5: error: no matching function for call to 'Print'
Print(itorRB,itorRE);
^~~~~
cpp_test.cpp:7:5: note: candidate template ignored: couldn't infer template argument 'T1'
int Print(typename vector<T1>::const_iterator itorStart, typename vector<T1>::const_iterator itorEnd)
^
cpp_test.cpp:18:5: note: candidate template ignored: couldn't infer template argument 'T2'
int Print(typename vector<T2>::const_reverse_iterator itorStart, typename vector<T2>::const_reverse_iterator itorEnd)
^
2 errors generated.
[Done] exited with code=1 in 0.267 seconds
这只能说明模板的类型推导有问题,这该怎么写?如何写一个针对任意类型的迭代器的打印函数?
https://www.mersenneforum.org... 看下下面的回复