Autor Wątek: [C++][Dziedziczenie][Szablony] no matching function for call  (Przeczytany 2787 razy)

Offline Smokeing

  • Użytkownik

# Styczeń 08, 2011, 17:20:22
Witam.

Kompilator: GCC
System: Linux Debian (testing)

Mam takie pliki:

main.cpp:
#include "List.hpp"

using namespace std;

int main(int argc, char** argv)
{
    CList <int> Lista;

    Lista.Push(666);

    return 0;
}



ListBase.hpp:
#ifndef LISTBASE_HPP
#define LISTBASE_HPP

template <class T>
class CListBase
{
protected:
    unsigned int CurrentNo;
public:
    CListBase();
    virtual ~CListBase();
   
    virtual void Push(T Dane, unsigned int Place);
    void Push(T Dane);
};

template <class T>
CListBase<T>::CListBase()
{
   
}

template <class T>
CListBase<T>::~CListBase()
{

}

template <class T>
void CListBase<T>::Push(T Dane)
{
    Push(Dane, CurrentNo);
}

#endif /* LISTBASE_HPP */



List.hpp:
#ifndef LIST_HPP
#define LIST_HPP

#include "ListBase.hpp"

template <class T>
class CList : public CListBase<T>
{
private:
public:
    CList();
    ~CList();

    void Push(T Dane, unsigned int Place);
};

template <class T>
CList<T>::CList()
{

}

template <class T>
CList<T>::~CList()
{

}

template <class T>
void CList<T>::Push(T Dane, unsigned int Place)
{
    //Właściwa implementacja Push'a
}

#endif /* LIST_HPP */



Podczas próby kompilacji wyrzuca:
Cytuj
error: no matching function for call to ‘CList<int>::Push(int)’
note: candidates are: void CList<T>::Push(T, unsigned int) [with T = int]

Dlaczego tak się dzieje?

Z góry dzięki za pomoc
Smokeing

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kos

  • Użytkownik
    • kos.gd

# Styczeń 08, 2011, 17:23:14
Keyword do googla: Shadowing. Deklaracja w dziedziczącej ukrywa wszystkie overloady w bazowej.

lista.ListBase<int>::Push(666) by chyba zadziałało.

Nazwij funkcje inaczej i tyle... Drżę na samą myśl, jak można jeden overload mieć wirtualny, a drugi nie :)
« Ostatnia zmiana: Styczeń 08, 2011, 17:27:04 wysłana przez Kos »

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Styczeń 08, 2011, 17:25:36
Dodaj do nazwy tematu [Linux] i [GCC], bo jeszcze ktoś może nie zrozumieć o co chodzi :P.

Offline Smokeing

  • Użytkownik

# Styczeń 08, 2011, 17:32:30
Ale Push z jednym parametrem nie jest overloadowany... Chyba że o czymś nie wiem?
Z poziomu funkcji klasy CList jestem w stanie dostać się do tego Pusha.
Gdy zrobię tak:
lista.ListBase<int>::Push(666)

Jak zmienię nazwę to faktycznie działa, jednakże myk polegał na tym aby nazwa została :D

Offline gawron89

  • Użytkownik

# Styczeń 08, 2011, 17:35:39
mozesz zadeklarowac bazowa funkcje push jako abstrakcyjna, na visualu to pomoglo
template <class T>
class CListBase
{
protected:
    unsigned int CurrentNo;
public:
    CListBase();
    virtual ~CListBase();
   
    virtual void Push(T Dane, unsigned int Place) = 0;
    void Push(T Dane);
};

Offline Smokeing

  • Użytkownik

# Styczeń 08, 2011, 17:43:48
Niestety nie pomogło :/

Offline punish3r

  • Użytkownik

# Styczeń 08, 2011, 17:47:36
W CList:

void Push(T Dane, unsigned int Place);
using CListBase<T>::Push;

Nie pamiętam, czy musi być <T>.

Offline Smokeing

  • Użytkownik

# Styczeń 08, 2011, 17:51:41
Wielkie dzięki wszystkim :D
Działa sposób podany przez punish3ra.

Temat do zamknięcia :D

Offline Kos

  • Użytkownik
    • kos.gd

# Styczeń 08, 2011, 17:53:50
Cytuj
Jak zmienię nazwę to faktycznie działa, jednakże myk polegał na tym aby nazwa została :D

Propozycja: Nie rób "myka" i przemianuj wirtualne Push na Insert, żeby chociaż błędu terminologicznego nie miało w nazwie :).

Offline Smokeing

  • Użytkownik

# Styczeń 08, 2011, 18:17:48
Ja tu nie widzę błędów terminologicznych. To jest moja klasa i funkcje nazywają się tak jak w mojej specyfikacji :D

Offline punish3r

  • Użytkownik

# Styczeń 08, 2011, 18:18:14
Możesz użyć wzorca Metody Szablonowej (template method pattern):

public:
    void Push(T Dane, unsigned int Place) { DoPush(Dane, Place); }
    void Push(T Dane)  { DoPush(Dane, CurrentNo); }

private:
    virtual void DoPush(T Dane, unsigned int Place) = 0;

Offline Kos

  • Użytkownik
    • kos.gd

# Styczeń 08, 2011, 18:19:03
Ja tu nie widzę błędów terminologicznych. To jest moja klasa i funkcje nazywają się tak jak w mojej specyfikacji :D
Jeśli "push" dodaje u Ciebie równie dobrze w środek, co na koniec, to OK. Możesz iść dalej tym tropem i nazwać swoją listę silnikiem graficznym :).

Offline Smokeing

  • Użytkownik

# Styczeń 08, 2011, 18:42:59
Hmm. Silnikiem graficznym miała być struktura Vector, ale może i masz rację. Zmienię moje nazwy na te już przyjęte :P