C++ 类型推导,模板的类型推导有问题,如何解决?怎样写一个针对任意类型的迭代器的打印函数?

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

这只能说明模板的类型推导有问题,这该怎么写?如何写一个针对任意类型的迭代器的打印函数?

阅读 3k
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题