[ Ivan Vasić @ 12.04.2004. 13:55 ] @
Imam templejtsku klasu

Polinom<Tip,Stepen>

Kako u okviru nje da definišem operator za množenje 2 polinoma ?

Problem je u tome što novonastali polinom treba da bude stepena StepenPrvog+StepenDrugog što zadaje probleme ako probam:

Code:

template <class Tip, int Stepen>
class Polinom {
...
Polinom<Tip,Stepen1+Stepen2>& operator* (Polinom<Tip,Stepen1> P1, Polinom<Tip,Stepen2> P1);


ovo naravno nije moguće ... (ni Stepen1 ni Stepen2 nisu def.)

Kako da izvedem ovo pod uslovom da templejt MORA da bude definisan sa <Tip,Stepen>.
[ Dragi Tata @ 12.04.2004. 16:19 ] @
Ako već hoćeš da ti operator * bude član klase, onda ga deklariši kao:

Code:

    template<int Stepen1>
        Polinom <Tip, Stepen+Stepen1> operator * (const Polinom<Tip,Stepen1>& P1);
[ Reljam @ 12.04.2004. 16:44 ] @
Da li si siguran da polinom treba da ima stepen kao parametar templejta? To mi nekako zvuci kao string koji ima 'duzinu' template parametar. Cak i da resis ovaj problem, imaces posle gomilu problema at run time jer ces imati gomilu potpuno istih klasa koja se razlikuju samo za 'stepen' - nemoj da zaboravis da kompajler mora da napravi klasu za svaki slucaj templatea koj koristis.

Takodje svi parametri za templateove moraju da budu poznati at compile time. Tako da cak ni teoretski ne mozes da koristis stepen kao parametar templatea osim ukoliko unapred ne znas da ces imati samo dva ili tri razliticita polinoma.

Drugim recima, neces moci da uradis ovo:
Code:

int stepen;
for (stepen = 1; stepen < 10; stepen++)
{
    Polinom<float, stepen> MojPolinom;
}


Dakle probaj da redizajniras celu stvar, jer template parametri se ne koriste za to sto ti pokusavas da uradis.
[ Mrav @ 12.04.2004. 17:06 ] @
Reljam je naj u pravu.

Mislim da bi trebalo da imaš nešto ovako;

template <class tip>
class Polinom{
public:
Polinom (int stepen);

// deklaracija operatora *

private:
int stepen;

}

pa da deklarišeš:

Polinom<float> pol(neki stepen);
[ Dragi Tata @ 12.04.2004. 17:09 ] @
U principu je moguće koristiti šablone u takve svrhe - to se zove template metaprogramming. E sad, da li on to hoće ili jednostavno ne razume prirodu šablona, to već ne znam...
[ Ivan Vasić @ 12.04.2004. 17:30 ] @
Svi ste vi u pravu

Razumem ja prirodu šablona i da sam ja pravio to onako kako ja to želim takodje bi u templejtu imalo samo jedan parametar ali tako se od mene traži u zadatku
što bi značilo da tako mora ! Šta da radim kad me maltretiraju glupostima ...

E sad, ja mogu da definišem int u okviru klase koji će da bude stepen i da zanemarim templejtski stepen ali čemu onda ...

Uostalom onaj kod koji je napisao Nemanja mi se čini najbliže rešenju. Probaću.
Bitno je samo da ipak ovo nije baš "uobičajeno" što se traži tako da me to hrabri.

Jel ima možda još nekih ideja ?
[ Ivan Vasić @ 12.04.2004. 17:44 ] @
Trebaće mi još malkice pomoći oko ovoga:

operatorsku funkciju sam morao da definišem "inline" jer nisam umeo drugačije i to ovako izgleda:
Code:
template<int Stepen1>
        Polinom <Tip, Stepen+Stepen1> operator* (const Polinom<Tip,Stepen1>& P1)
        {
            Polinom<Tip,Stepen+Stepen1> Rezultat;

            Mnozi(P1,Rezultat);

            return Rezultat;
        };


pod pretpostavkom da Mnozi() radi kako treba, kako da pozovem ovaj operator u main-u ??

Pitam jer ne znam gde da smestim templejtske argumente tj. <Stepen1>

ako stavim : (imam copy constructor)
Code:

Polinom<int,5> Proizvod(P1 * P2) ;


dobijem INTERNAL COMPILER ERROR.
[ Dragi Tata @ 12.04.2004. 18:00 ] @
Pre svega, koji kompajler imaš? Stari kompajleri se slabo snalaze sa ovakvim egzibicijama.

Uglavnom, meni ovako nešto radi na MSVC 7.1 (sam operator je "šupalj" - ne vrši nikakvo množenje već samo vraća nov objekat):

Code:

    Polinom<double, 2> p;
    Polinom<double, 3> q;
    Polinom<double, 5> r = p * q;


Obrati pažnju da je stepen rezultujućeg polinoma jednak zbiru stepeni množilaca. U suprotnom, dobiješ compile-time error.
[ Ivan Vasić @ 12.04.2004. 18:21 ] @
Imam MSVC 6.

Inače i ona moja fja mnozi() je takodje prazna tako da i ja dobijam samo novi objekat.

Sve regularno evo:

Code:

    Polinom<int,3> Po;
    Polinom<int,2> Po1;
    Polinom<int,5> Po3 = Po1 * Po;


možda bi trebalo da odradim :
Po3 = Po1.operator*<2> Po ????
Nešto ovako ako je uopšte moguće ??
[ Dragi Tata @ 12.04.2004. 18:49 ] @
Ako ćeš da radiš nešto ozbiljnije sa šablonima, savetujem ti da nađeš neki noviji kompajler. Najbolji u tom pogledu je Comeau 4.3.3, a od popularnijih, dobri su i VC 7.1 i gcc 3.2+
[ Ivan Vasić @ 12.04.2004. 19:03 ] @
Ok. Probaću da nabavim. Thnx