gpt4 book ai didi

c++ - 模板错误 : no matching function call

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:44 26 4
gpt4 key购买 nike

我正在通过加速 C++ 工作,遇到了 Ex 问题。 10.2这些问题涉及重写上一章的中值函数,以便现在可以使用 vector 或内置数组调用中值。中值函数还应该允许任何算术类型的容器。

我无法对下面详述的 median 进行两次调用 - 我收到了错误消息

No matching function for call to 'median'

我从一些研究中了解到,当使用模板时,应该在编译时知道类型。这可能是根本问题吗?有没有办法以某种方式将 Type 作为模板参数传递?

到目前为止,这是我的代码:

#include <iostream>
#include <vector>
#include <stdexcept>
#include <algorithm>
#include <cstddef>

using namespace std;

template <class Iterator, class Type>
Type median(Iterator begin, Iterator end)
{
vector<Type> vec(begin,end);
typedef typename vector<Type>::size_type container_sz;
container_sz size = vec.size();

if (size == 0) {
throw domain_error("median of an empty vector");
}

sort(vec.begin(), vec.end());

container_sz mid = size/2;
return size % 2 == 0 ? (vec[mid] + vec[mid - 1]) / 2 : vec[mid];
}

int main()
{
vector<int> grades;

for (int i = 0; i != 10; ++i){
grades.push_back(i);
}

const int int_array[] = {2, 9, 4, 6, 15};
size_t array_size = sizeof(int_array)/sizeof(*int_array);

cout << median(int_array, int_array + array_size) << endl; //error here: Semantic Issue, No matching function for call to 'median'
cout << median(grades.begin(), grades.end()) << endl; //error here: Semantic Issue, No matching function for call to 'median' "

return 0;
}

最佳答案

通常,解决此问题的最佳方法是使用 iterator_traits如上所述。然而,为了回答书中的特定问题 10.2(不假定 Iterator_trait 知识),可以按以下步骤进行:- 注意类 Type 必须首先列出,而不是类 Iterator。此外,必须调用 median<int>(grades.begin(), grades.end())而不是 median(grades.begin(), grades.end())

#include <iostream>
#include <vector>
#include <stdexcept>
#include <algorithm>
#include <cstddef>

using namespace std;

template <class Type, class Iterator> //the order allows the second template parameter type to be deduced (Iterator)
Type median(Iterator begin, Iterator end) //while requiring you still provide the first type
{

vector<Type> vec(begin,end);

//typedef typename vector<Type>::size_type container_sz;
//container_sz size = vec.size()
auto size = vec.size();

if (size == 0) {
throw domain_error("median of an empty vector");
}

sort(vec.begin(), vec.end());

//container_sz mid = size/2
auto mid = size/2;

Type ret = size % 2 == 0 ? (vec[mid] + vec[mid - 1]) / 2 : vec[mid];

return ret;
}


int main()
{

vector<int> grades = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

const int int_array[] = {2, 9, 4, 6, 15};

size_t array_size = sizeof(int_array)/sizeof(*int_array);

cout << median<int>(int_array, int_array + array_size) << endl; //must provide int here, in order to give the template the return type at compile time
cout << median<int>(grades.begin(), grades.end()) << endl;


return 0;

关于c++ - 模板错误 : no matching function call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16572515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com