Pracuję na mojej drodze poprzez przyspieszone C++ & trafiłem na problem z Ex. 10.2 Pytania dotyczą przepisywania funkcji mediany z poprzedniego rozdziału, aby teraz medianę można było wywoływać za pomocą wektora lub wbudowanej tablicy. Funkcja mediana powinna także umożliwiać pojemniki dowolnego typu arytmetycznego.Błąd przy szablonach: brak pasującej funkcji zadzwoń
nie mogę zrobić dwa połączenia do środkowej szczegółowy poniżej - pojawia się komunikat o błędzie
No matching function for call to 'median'
wnoszę z niektórych badań, które, gdy są używane szablony Type powinien być znany w czasie kompilacji. Czy to może być podstawowy problem? Czy istnieje sposób, aby jakoś przekazać typ jako argument szablonu?
Oto mój kod do tej pory:
#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;
}
Jeśli używasz C++ 11 można zainicjować wektora z wektorem klas '= {0, 1, 2, 3, 4 , 5, 6, 7, 8, 9} 'i' auto size = vec.size(); '(tj. Usunięcie typedef). Możesz również zamienić 'endl' na' "\ n" 'jeśli chcesz. –
W przypadku korzystania z czytników pierwszego przejścia, uprzejmie zaznacz, który wiersz (w tym * oba * jeśli tak jest), powoduje błąd kompilacji z komentarzem (np. '// <== błąd tutaj"). To powiedziawszy, parametru szablonu "Typ' nie można wyprowadzić z wywołań, które tworzysz, co jest ostatecznie głównym problemem. Myślę, że szablon dostarczony przez bibliotekę standardową [iterator_traits'] (http://en.cppreference.com/w/cpp/iterator/iterator_traits) może być czystym rozwiązaniem twojego problemu. – WhozCraig
Proszę podać pełny komunikat o błędzie. Zwykle mówi, jakie typy dedukuje w wywołaniu funkcji, które można porównać z rzeczywistymi oczekiwanymi typami. –