Szablony funkcji - funkcja specjalizowana


(eureka 170) #1

Witam,

Mój problem polega na tym, że napisałem funkcję specjalizowaną "porównaj", która została zadeklarowana po szablonie funkcji i przed jej wywołaniem, ale kiedy w main próbuję ją wywołać, to następuje odwołanie do funkcji szablonowej i przez to program nie może się skompilować. Oto kod:

#include 

#include 

using namespace std;


template 

const T& kwadrat_liczby(const T &liczba)

{

    return liczba*liczba;

}

template 

const B& suma(const A &liczba1, const B& liczba2)

{

    return liczba1+liczba2;

}

template 

const T& tablice( T tab[5])

{

    int min;

    for(int i=0;i<5;i++)

    {

        cout << "Podaj liczbe " << i << ": ";

        cin >> tab[i];

        cout << endl;

    }

    min = tab[0];

    for(int i=0;i<5;i++)

    {

        if(tab[i]
        min = tab[i];

    }

    return min;

}


template 

const T porownaj(const T&liczba1, const T& liczba2)

{

    if(liczba1>liczba2)

    {

        return 1;

    }

    if(liczba1
    {

        return -1;

    }

    else

    {

        return 0;

    }

}

void porownaj(const char* tekst1, const char* tekst2)

{

    if(strlen(tekst1)>strlen(tekst2))

    {

        cout << "Tekst1 jest dluzszy" << endl;

    }

    if(strlen(tekst1)
    {

        cout << "Tekst2 jest dluzszy" << endl;

    }

    else

    {

        cout << "Obydwa teksty sa rowne" << endl;

    }

}


int main()

{

    int b,c=5;

    float a=6.54;

    b=5;

    int C[5];

    char *X = new char[80];

    char *Y = new char[80];

    X = "Witaj";

    Y = "Swiecie";

    int tab[5];

    cout << kwadrat_liczby(b) << endl;

    cout << suma(b,a) << endl;

    cout << porownaj(b,c) << endl;

    porownaj(X,Y);

    cout << tablice(tab) << endl;


    return 0;

}

Co ja muszę w tutaj zmienić?


(Sawyer47) #2
  1. Brak dla strlen

  2. W C++ to nie działa, tak jakby się wydawało

    char *X = new char[80];

    char *Y = new char[80];
    
    X = "Witaj";
    
    Y = "Swiecie";
  3. Czemu w porownaj zwracasz T? Przy specjalizacji masz niewłaściwe konwersje z int na char*

  4. Jeśli chcesz aby porownaj(const char*, const char*) było specjalizacją, to czemu w niej nic nie zwracasz? A wygląda na to, że nie przeładowuje jej właśnie przez te const

  5. Ponadto g++ wyrzuca ostrzeżenia, bo zwracasz referencje do lokalnych/tymczasowych zmiennych.

Ogólnie niezbyt przemyślany ten kod, przy innych specjalizacjach pewnie miałbyś więcej błędów.


([alex]) #3

1.

//const T& kwadrat_liczby(const T &liczba)

T kwadrat_liczby(const T &liczba)

2.

//const B& suma(const A &liczba1, const B& liczba2)

B suma(const A &liczba1, const B& liczba2)

3.

//const T& tablice( T tab[5])

int tablice( T tab[5])

4.

//const T porownaj(const T&liczba1, const T& liczba2)

int porownaj(const T&liczba1, const T& liczba2)

Funkcja wyspecjalizowana nie ma nic a nic wspólnego z błędem.


(etam) #4

http://www.cplusplus.com/doc/tutorial/templates/ dział "Template specialization"

template 

int porownaj(const T&liczba1, const T& liczba2) {...}


template <>

int porownaj (const char* tekst1, const char* tekst2) {...}

(eureka 170) #5

Dzięki za pomoc. Mam jeszcze jeden problem też związany z szablonami, ale to już inny program:

#include 


using namespace std;

const int rozmiar = 4;


class Liczby

{

    public:

    Liczby(int a);

    Liczby();

    ~Liczby(){}

    int wyswietl() {return b;}

    private:

    int b;

};

Liczby::Liczby(int a):

b(a)

{}


Liczby::Liczby():

b(0){}


template class Tablice;


template 

ostream& operator<< (ostream& output, Tablice& theArray)

{

	for (int i = 0; i
		output << "[" << i << "] " << theArray[i] << endl;

	return output;

}

template 

class Tablice

{

    public:

    Tablice(int rozm = rozmiar);

    ~Tablice(){delete wsk;}

    T& operator[](int indeks){return wsk[indeks];}

    friend ostream & operator<< <>(ostream &, const Tablice &);

    int GetSize() const { return rozm; }

    private:

    int rozm;

    T *wsk;

};


template 

Tablice::Tablice(int size):

rozm(size)

{

	wsk = new T[size];

	for (int i = 0; i
		wsk[i] = 0;

}


int main()

{

   Tablice numbers;

   Liczby *p;

   for(int i=0;i
   {

       p = new Liczby(i*2);

       numbers[i] = *p;

       delete p;

   }

   cout << numbers;

    return 0;

}

Wyskakuje mi błąd:

Siedzę i modyfikuję ten operator << ale nic sensownego mi nie wychodzi, na nic nie mogę wpaść. Czy moglibyście mi napisać, co ja tutaj robię źle?


([alex]) #6
  1. Brakuje sposobu na wydrukowanie obiektu klasy Liczby:

    class Liczby{