View Full Version : [c++]Template e argomenti di default
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
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;
}
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ì
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:
Originariamente inviato da Gen.Web
se compilo quel codice il compilatore segnala diversi errori.
Quali errori ?
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 :)
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
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
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...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.