Wskaźnik do przeciążonych funkcji

0

Mam problem z użyciem kilku wskaźników do przeciążonych funkcji. Załóżmy że mam dwie funkcje sortujące dla trzech typów danych: tablica double, wektor double i wektor int. Funkcje, nazwijmy je sort1 i sort są zadeklarowane dla tablicy i umieszczone w szablonie dla wektora:

typedef void(*wskazniktab)(double*, int);
typedef void(*wskaznik)(vector <double> &, int);
typedef void(*wskaznikint)(vector <int> &, int);

void sort1 (double tab[], int i);
void sort2 (double tab[], int i);

template <typename Item>
void sort1(vector <Item> &tab, int i);

template <typename Item>
void sort2(vector <Item> &tab, int i);

Funkcje:

void sortuj(wskaznik funkcje[], vector <double> &dane, int i){
    funkcje[0](dane, i);
    funkcje[1](dane, i);
}

void sortuj(wskazniktab funkcje[], double dane[], int i){
    funkcje[0](dane, i);
    funkcje[1](dane, i);
}

W mainie mam stworzone tablice z nazwami funkcji do wywołania:

wskaznik nazwy[2]={sort1, sort2};
wskazniktab nazwytab[2]={sort1, sort2};

Dopóki napisałem fragment działający na tablicy, wszystko było w porządku. Wystarczyło jednak dopisać część dla wektora double i dostaję taki błąd:
[Error] cannot convert 'void (**)(std::vector<double>&, int, int)' to 'wskaznik {aka void (*)(std::vector<double>&, int, int)}' in initialization
Nie potrafię znaleźć błędu, będę wdzięczny za pomoc.

0

Zacznij od tego że zrób uniwersalną samą funkcję:

template <class Itr> void sortuj(Itr first,Itr last) { ... }

Dla tablicy będziesz odpalać tak:

sortuj(tab,tab+ileElementow);

Dla vector'a tak:

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

A nawet dla array'a tak:

sortuj(arr.begin(),arr.end());

Wtedy nie potrzebujesz wsadzenia do jednego wskaźnika różnych funkcji, bo w sposób bezpośredni ten twój sposób nie przejdzie.

0

Chętnie bym z tego skorzystał, gdyby nie fakt, że to projekt na zajęcia i mam wytyczne, jak to ma być zrobione.

0

No to możesz teoretycznie to zrobić tak:

wskaznik nazwy[2]={sort1<double>, sort2<double>};
0
 expected primary-expression before 'double'
expected ')' before 'double'
expected ', or ';' before 'double
0

http://ideone.com/CFuhSy

#include <iostream>
#include <vector>
using namespace std;

typedef void(*wskazniktab)(double*, int);
typedef void(*wskaznik)(vector <double> &, int);
typedef void(*wskaznikint)(vector <int> &, int);
 
void sort1 (double tab[], int i);
void sort2 (double tab[], int i);
 
template <typename Item>
void sort1(vector <Item> &tab, int i);
 
template <typename Item>
void sort2(vector <Item> &tab, int i);


void sortuj(wskaznik funkcje[], vector <double> &dane, int i){
    funkcje[0](dane, i);
    funkcje[1](dane, i);
}
 
void sortuj(wskazniktab funkcje[], double dane[], int i){
    funkcje[0](dane, i);
    funkcje[1](dane, i);
}


int main() {
    wskaznik nazwy[2]={sort1<double>, sort2<double>};
    wskazniktab nazwytab[2]={sort1, sort2};
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1