模板容器迭代器
Template container iterators
我正在处理作业问题,但我无法编译这个问题:
我需要编写接受两个迭代器(对于任何容器)和return成对的最小值和最大值的函数
这是我遇到的错误:
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'
这是我的代码:
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::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";
}
编译器告诉您的是它无法从您提供给函数的参数中找出 T
。函数的模板参数要么必须显式提供 (a_ans = problem1<vector<int>::iterator, int>(a.begin(), b.begin())
),要么必须从函数参数中扣除(编译器根据 start
和 [=15= 猜测 It
]参数)。
幸运的是,迭代器有一个 value_type
成员:
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);
}
基本上,您将 T
替换为 typename It::value_type
。这是有效的,因为 iterator types know their value types,并且它也适用于 C++11 之前的版本(以防你的老师对新语言版本感到害羞)。
编译器无法知道 T
是什么类型。
您可以将其从模板中删除并改用 decltype(*start)
。
使用 decltype 的优点是它可以使用原始指针和非标准迭代器(不像 ::value_type)
我正在处理作业问题,但我无法编译这个问题:
我需要编写接受两个迭代器(对于任何容器)和return成对的最小值和最大值的函数
这是我遇到的错误:
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'
这是我的代码:
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::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";
}
编译器告诉您的是它无法从您提供给函数的参数中找出 T
。函数的模板参数要么必须显式提供 (a_ans = problem1<vector<int>::iterator, int>(a.begin(), b.begin())
),要么必须从函数参数中扣除(编译器根据 start
和 [=15= 猜测 It
]参数)。
幸运的是,迭代器有一个 value_type
成员:
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);
}
基本上,您将 T
替换为 typename It::value_type
。这是有效的,因为 iterator types know their value types,并且它也适用于 C++11 之前的版本(以防你的老师对新语言版本感到害羞)。
编译器无法知道 T
是什么类型。
您可以将其从模板中删除并改用 decltype(*start)
。
使用 decltype 的优点是它可以使用原始指针和非标准迭代器(不像 ::value_type)