Sto lavorando a C++ accelerato & ha colpito un problema con Ex. 10.2 Le domande riguardano la riscrittura di una funzione mediana da un capitolo precedente, in modo che ora la mediana possa essere chiamata con un vettore o un array incorporato. La funzione mediana dovrebbe anche consentire contenitori di qualsiasi tipo aritmetico.Errore con i modelli: nessuna chiamata di funzione corrispondente
Non è possibile effettuare le chiamate a due mediana dettagliato qui sotto - ricevo il messaggio di errore
No matching function for call to 'median'
ho capito da alcune ricerche che, quando si utilizzano modelli Type dovrebbe essere noto al momento della compilazione. Potrebbe essere questo il problema di fondo? C'è un modo per passare in qualche modo il Type come argomento template?
Ecco il mio codice finora:
#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;
}
Se si utilizza C++ 11 è possibile inizializzare il vettore con 'vettore gradi = {0, 1, 2, 3, 4 , 5, 6, 7, 8, 9} 'e' auto size = vec.size(); '(ovvero rimuovendo il typedef). Puoi anche sostituire 'endl' con' "\ n" 'se vuoi. –
Per i lettori di primo passaggio, contrassegnare gentilmente quale linea (incluso * entrambi * se questo è il caso) che causa l'errore in fase di compilazione, con un commento (ad esempio '// <== errore qui '). Detto questo, il parametro del modello 'Tipo' non può essere dedotto dalle chiamate che stai facendo, che è in definitiva il problema principale. Penso che il template fornito dalla libreria standard ['iterator_traits'] (http://en.cppreference.com/w/cpp/iterator/iterator_traits) possa essere una soluzione pulita al tuo problema. – WhozCraig
E per favore includi il messaggio di errore completo. Di solito dice quali tipi deduce nella chiamata alla funzione, che è possibile confrontare con i tipi effettivi attesi. –