wskaźnik na szablon funkcji

wskaźnik na szablon funkcji
NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
0

mam metodę klasy Pqueue:

Kopiuj
template<typename Type>Pointer<Type> Pqueue<Type>::getpointer(parg args,Type * target)
{
    Type * help;
    for (unsigned int i=0; i<pqueue.size(); i++)
    {
        if ( args<pqueue[i]>(target) )
        {
            help=pqueue[i];
            return Pointer<Type*>(true,&help);
        }
    }
    return Pointer<Type*>(false,NULL);
} 

a tutaj definicja klasy pqueue:

Kopiuj
template<typename Type>class Pqueue
{
public:
    vector<Type*>pqueue;
public:
    typedef bool( * parg )(Type*);
    void add(Type * pointer);
    void remove(Type * pointer);
    int size();
    Type * operator [] (int index);
    Pointer<Type> getpointer(parg arg,Type * pointer);
    Pqueue();
    Pqueue(Type* target);
    Pqueue(vector<Type*> target);
    Pqueue(const Pqueue& target);
    ~Pqueue();
}; 

i definicja klasy pointer

Kopiuj
template<typename Type>struct Pointer
{
    Type * wpointer;
    bool correct;
    Pointer<Type>();
    Pointer<Type>(bool Correct,Type * pointer);
    Pointer<Type>(const Pointer<Type> & target);
    ~Pointer<Type>() {}
}; 

a tutaj błąd:

Kopiuj
nta.hpp|210|error: comparison between distinct pointer types 'Pqueue<Window>::parg {aka bool (*)(Window*)}' and 'Window*' lacks a cast [-fpermissive]| 

jak naprawić ten błąd?

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
0

No i która linia to jest ta 210?

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
0

ups, no faktycznie nie widać ;) błąd dotyczy tej linijki

Kopiuj
if ( args<pqueue[i]>(target) ) 

args to wskaźnik na szablon funkcji która zwraca bool i przyjmuje wskaźnik na klasę Window... ale kiedy podaję ten wskaźnik to wywala błąd

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
0

w międzyczasie posprawdzałem pare rzeczy i okazało się że to problem z szablonem... tylko jak mam zrobić wskaźnik na szablon funkcji?

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0
Kopiuj
#include <iostream>
using namespace std;

template<typename T>
class Foo
{
	public:
	Foo(){}
}; 

typedef Foo<int>* fooIntPointer;

int main() {
	fooIntPointer ptr = new Foo<int>();
	return 0;
} 

to jest co prawda szablon na klase. Ale na funkcje bedzie podobnie.

EvilOne
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 78
0

spróbuj tak:

Kopiuj
template<typename Type>
Pointer<Type> Pqueue<Type>::getpointer(parg args, Type* target)
{
	Type* help = NULL;

	for(unsigned int i = 0; i < pqueue.size(); i++)
	{
		if(args(target))
		{
			help = pqueue[i];

			return Pointer<Type>(true, help);
		}
	}

	return Pointer<Type>(false, help);
}
NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
0

sprawdziłem ten sposób:

Kopiuj
    template<Type *>bool helpargs(Type *);
    typedef helpargs<Type * target>* parg; 

i nie działa... nadal nie wiem jak to zrobić

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1
Niikelion napisał(a):

w międzyczasie posprawdzałem pare rzeczy i okazało się że to problem z szablonem... tylko jak mam zrobić wskaźnik na szablon funkcji?

Nie można zrobić wskaźnika na szablon funkcji.

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
0

no to wszystko jasne

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
2

rozwine wypowiedz @twonek

Wskaznik mozesz zrobic na konkretny typ szablonu (konkretyzacja). Jezeli chcesz miec wskaznik na szablon ktory bedzie intem czy obiektem typu Foo to mozesz to zrobic (popatrz ze w moim przykladzie wskaznik na klase jest typu int)

NIE MOZESZ zrobic wskaznika ktory jest "generalny" (w sensie jest typu Type) bo szablon to szablon. On zostaje wygenerowany podczas kompilacji.
Mialbys przez to wskazniki ktore maja te same nazwy ale zwracaly by rozne typy, co jest nie mozliwe

http://ideone.com/MbuONC

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.