PDA

View Full Version : [c++]Template e argomenti di default


Gen.Web
13-09-2004, 16:14
Con i template è impossibile passare argomenti di default a funzioni? Ho provato a mettere un int x=0 in una funzione di una classe, ma il compilatore si arrabbia :)
E' veramente scomodo non poter passare parametri di default

cionci
13-09-2004, 16:29
A me non da problemi, tanto per provare:

#include <iostream>

using namespace std;

template <class T>
class ciao{
T c;
int i;
public:
ciao(int ii=10);
friend ostream & operator << (ostream & os, ciao<T> obj);
};

template <class T>
ciao<T>::ciao(int ii)
{
i = ii;
c = T(0);
}


template <class T>
ostream & operator << (ostream & os, ciao<T> obj)
{
os << obj.i << " " << obj.c;
return os;
}


int main()
{
ciao<int> c;
cout << c << endl;
ciao<float> f(100);
cout << f << endl;
return 0;
}

Gen.Web
13-09-2004, 16:40
Originariamente inviato da cionci
A me non da problemi, tanto per provare:

#include <iostream>

using namespace std;

template <class T>
class ciao{
T c;
int i;
public:
ciao(int ii=10);
friend ostream & operator << (ostream & os, ciao<T> obj);
};

template <class T>
ciao<T>::ciao(int ii)
{
i = ii;
c = T(0);
}


template <class T>
ostream & operator << (ostream & os, ciao<T> obj)
{
os << obj.i << " " << obj.c;
return os;
}


int main()
{
ciao<int> c;
cout << c << endl;
ciao<float> f(100);
cout << f << endl;
return 0;
}




se compilo quel codice il compilatore segnala diversi errori.
Cmq ho capito questo: se in una funzione c'è un argomento del tipo NomeClasse<T>, allora non posso passare argomenti di default di nessun tipo, neanche int i=0. Se invece non c'è nessun tipo NomeClasse<T> allora posso passarli. Possibile? A me risulta così

Gen.Web
13-09-2004, 16:43
ma porca eva adesso va anche se passo come argomenti dei NomeClasse<T> :confused: :confused:
Ieri ho fatto un albero binario e mi dava errore se passavo argomenti di default. Ora posto il codice

#include <iostream>
#include <stdio.h>
using namespace std;


template <class T>
class Node {
T itsvalue;
Node<T> *left;
Node<T> *right;
public:
Node(T value);
void setValue(T value);
T getValue();
Node<T> *getLeft();
Node<T> *getRight();
void printValue();
~Node();

};

template <class T>
class Tree {
Node<T> * root;
int count;
public:
Tree(Node<T> * radix);
Tree(T value);
void insertNode(T value, Node<T> *temp=0, int i=0);
void printInOrder();
void printInOrder2(Node<T> *temp);
//void printPostOrder();
//void printPreOrder();
~Tree();
};

.....
.....


template <class T>
void Tree<T>::insertNode(T value, Node<T> *temp=0, int i=0) {
if (temp!=0) {
if(value<=temp->getValue()) {
if((temp->getLeft())!=0) insertNode(value, temp->getLeft(), 1);
else {
temp->getLeft()=new Node<T>(value);
count++;
}
}
if(value>temp->getValue()) {
if((temp->getRight())!=0) insertNode(value, temp->getRight(), 1);
else {
temp->getRight()=new Node<T>(value);
count++;
}
}
}
i++;
}


Non badare al codice della funzione... in origine era giusto, ma poi ho cercato di modificarlo dato che non potevo usare parametri di default.
Sia che io passi come argomenti di default Node<T> *temp=0, int i=0, sia che io passi solamente int i=0 il compilatore mi segnala
"error: default argument given for parameter 3 of `void Tree<T>::insertNode(T, Node<T>*, int)' "
Non capisco :muro:

cionci
13-09-2004, 16:44
Originariamente inviato da Gen.Web
se compilo quel codice il compilatore segnala diversi errori.
Quali errori ?

Gen.Web
13-09-2004, 16:54
Originariamente inviato da cionci
Quali errori ?

gli errori sono questi:
Linking...
C:\Documents and Settings\Terminator3\Documenti\informatica\esercizi\arredo\Debug\main.o(.text+0x47): In function `main':
C:\Documents and Settings\Terminator3\Documenti\informatica\esercizi\arredo\main.cpp:33: undefined reference to `operator<<(std::ostream&, ciao<int>)'
C:\Documents and Settings\Terminator3\Documenti\informatica\esercizi\arredo\Debug\main.o(.text+0x84):C:\Documents and Settings\Terminator3\Documenti\informatica\esercizi\arredo\main.cpp:35: undefined reference to `operator<<(std::ostream&, ciao<float>)'

Dai uno sguardo sopra, ho postato il codice. Ti ringrazio :)

cionci
13-09-2004, 17:17
A me non da alcun errore il mio codice sopra... Con VC++ 6...

Comunque riguardo a te:

- devi includere stdio.h in questo modo: <cstdio>
- i parametri di default si definiscono solo al momento della dichiarazione della funzione all'interno della dichiarazione della classe

Gen.Web
13-09-2004, 17:23
Originariamente inviato da cionci
A me non da alcun errore il mio codice sopra... Con VC++ 6...

Comunque riguardo a te:

- devi includere stdio.h in questo modo: <cstdio>
- i parametri di default si definiscono solo al momento della dichiarazione della funzione all'interno della dichiarazione della classe

- quella libreria per l'albero non mi serve... cmq xchè dovrei cambiargli nome?
- sn scemo

Io uso minigw

cionci
13-09-2004, 17:57
Perchè le librerie standard del C vengono incluse nel C++ in questo modo: la lettera c segita dal nome della libreria senza il .h...

Le libreri del C++ invece vengono incluse senza scrivere .h...