wskaźnik na szablon funkcji

Odpowiedz Nowy wątek
2015-06-19 12:38
0

mam metodę klasy Pqueue:

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:

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

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:

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?


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany

Pozostało 580 znaków

2015-06-19 12:44
0

No i która linia to jest ta 210?

Pozostało 580 znaków

2015-06-19 12:46
0

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

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


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany
edytowany 2x, ostatnio: Niikelion, 2015-06-19 13:01

Pozostało 580 znaków

2015-06-19 13:16
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?


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany

Pozostało 580 znaków

2015-06-19 13:22
0
#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.

edytowany 1x, ostatnio: fasadin, 2015-06-19 13:23
nie jestem pewien ale taka konstrukcja chyba nie zadziała... z tego co wiem wskaźniki na funkcje wyglądają inaczej niż na obiekty klasy - Niikelion 2015-06-19 13:31

Pozostało 580 znaków

2015-06-19 13:40
0

spróbuj tak:

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);
}
edytowany 1x, ostatnio: EvilOne, 2015-06-19 13:40
problem jest w tym, że to działa ale nie mogę podać niczego do szablonu <> i przez to nie mogę tam dać np typu - Niikelion 2015-06-19 13:42
ale to jest po prostu pozbawione jakiegokolwiek sensu. Co chciałeś przez to osiągnąć? Ładnie określiłeś przecież bool(*)(Type*) jak powinien wyglądać predykat. Nie rozumiem, po co chciałbyś jeszcze przekazywać tam typ? - EvilOne 2015-06-19 14:17

Pozostało 580 znaków

2015-06-19 13:40
0

sprawdziłem ten sposób:

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

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


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany

Pozostało 580 znaków

2015-06-19 13:43
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.

ale przeciez mozna miec do konkretnej instacji (w sensie ze jest np intem) a to autor chcial zrobic. aaahhh nie wazne... - fasadin 2015-06-19 13:47

Pozostało 580 znaków

2015-06-19 13:45
0

no to wszystko jasne


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany

Pozostało 580 znaków

2015-06-19 13:49
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

edytowany 2x, ostatnio: fasadin, 2015-06-19 13:52
ta "specjalizacja" to konkretyzacja, bo specjalizacja akurat ma inne znaczenie w kontekście szablonów - twonek 2015-06-19 13:51
no wlasnie zapomnialem tego slowka dlatego dalem w "" juz poprawiam - fasadin 2015-06-19 13:52

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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