C++ 模板容器迭代器

C++ 模板容器迭代器,c++,templates,iterator,C++,Templates,Iterator,我正在处理一个家庭作业问题,我无法将此问题编译: 我需要编写一个函数,它接受两个迭代器(对于任何容器),并成对返回最小值和最大值 以下是我得到的错误: Error 1 error C2783: 'std::pair<T,T> problem1(It,It)' : could not deduce template argument for 'T' Error 2 error C2783: 'std::pair<T,T> problem1(It,It)'

我正在处理一个家庭作业问题,我无法将此问题编译:

我需要编写一个函数,它接受两个迭代器(对于任何容器),并成对返回最小值和最大值

以下是我得到的错误:

Error   1   error C2783: 'std::pair<T,T> problem1(It,It)' : could not deduce template argument for 'T'  
Error   2   error C2783: 'std::pair<T,T> problem1(It,It)' : could not deduce template argument for 'T'
Error   3   error C2783: 'std::pair<T,T> problem1(It,It)' : could not deduce template argument for 'T'
Error 1 Error C2783:'std::pair problem1(It,It)':无法推断'T'的模板参数
错误2错误C2783:'std::pair problem1(It,It)':无法推断'T'的模板参数
错误3错误C2783:'std::pair problem1(It,It)':无法推断'T'的模板参数
这是我的密码:

template <typename It, typename T>
std::pair<T,T> problem1(It start, It end)
{
    // initial min max
    T min = *start;
    T max = *start;


    It curr = start;
    while (curr != end)
    {
        // check if we have a new min or max
        if (min > *curr)
            min = *curr;
        if (max < *curr)
            max = *curr;

        curr++; // get next
    }

    return std::make_pair(min, max);
}
模板
std::配对问题1(它开始,它结束)
{
//初始最小最大值
T min=*开始;
T max=*开始;
It curr=开始;
while(curr!=结束)
{
//检查是否有新的最小值或最大值
如果(最小值>*当前值)
最小值=*当前值;
如果(最大值<*当前值)
最大值=*当前值;
curr++;//获取下一个
}
返回标准::生成一对(最小值、最大值);
}
该代码正在使用以下代码进行测试,我无法修改

std::vector<int> a = { 1, 3, 12, -8, 22, 5, 41, 33 };
std::list<double> b = { 0.8, -123, 44, 56, 12, 231 };
std::array<unsigned int, 1> c;
c[0] = 12;
auto a_ans = problem1(a.begin(), a.end());
auto b_ans = problem1(b.begin(), b.end());
auto c_ans = problem1(c.begin(), c.end());
if (*a_ans.first == -8 && *a_ans.second == 41 &&
    *b_ans.first == -123 && *b_ans.second == 231 &&
    *c_ans.first == 12 && *c_ans.second == 12) {
    std::cout << "Test 1 passed.\n";
    score += 10;
}
else {
    std::cout << "Test 1 failed.\n";
}
std::向量a={1,3,12,-8,22,5,41,33};
列表b={0.8,-123,44,56,12,231};
std::数组c;
c[0]=12;
自动a_ans=问题1(a.开始(),a.结束());
自动开始=问题1(b.开始(),b.结束());
自动c_ans=问题1(c.开始(),c.结束());
如果(*a_ans.first==-8&&*a_ans.second==41&&
*b_ans.first==-123&*b_ans.second==231&&
*c_ans.first==12&*c_ans.second==12){

std::cout编译器告诉您的是,它无法从您提供给函数的参数中找出
t
。函数上的模板参数要么必须显式提供(
a_ans=problem1(a.begin(),b.begin())
),要么必须从函数参数中扣除(编译器根据
start
end
参数猜测
It

幸运的是,迭代器有一个
value\u类型
成员:

template <typename It>
std::pair<typename It::value_type, typename It::value_type> problem1(It start, It end)
{
    // initial min max
    typename It::value_type min = *start;
    typename It::value_type max = *start;


    It curr = start;
    while (curr != end)
    {
        // check if we have a new min or max
        if (min > *curr)
            min = *curr;
        if (max < *curr)
            max = *curr;

        curr++; // get next
    }

    return std::make_pair(min, max);
}
模板
std::配对问题1(它开始,它结束)
{
//初始最小最大值
typename It::value_type min=*start;
typename It::value_type max=*start;
It curr=开始;
while(curr!=结束)
{
//检查是否有新的最小值或最大值
如果(最小值>*当前值)
最小值=*当前值;
如果(最大值<*当前值)
最大值=*当前值;
curr++;//获取下一个
}
返回标准::生成一对(最小值、最大值);
}

基本上,你用
typename It::value\u type
替换
T
。这是因为,这在C++11之前也有效(以防你的老师对新的语言版本感到害羞)。

编译器无法知道
T
是什么类型。 您可以将其从模板中删除,并改用
decltype(*start)


使用decltype的优点是,它可以与原始指针和非标准迭代器一起工作(与::value_type不同)

1)您需要对其进行衰减,2)它不适用于返回代理的迭代器……查看测试代码,该函数似乎需要返回一对迭代器:/