Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-06-2006, 16:37   #1
riemann_01
Member
 
Iscritto dal: May 2006
Messaggi: 38
[C++] template

Salve a tutti!
Ho creato un programma generico per la gestione di una pila.
Quando tento di compilare il codice sorgente ricevo il seguente messaggio:
Codice:
$ g++ -o stack stack.cc
stack.h:42: warning: friend declaration ‘bool operator==(const stack<T>&, const stack<T>&)’ declares a non-template function
stack.h:42: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning
/tmp/cc9tKuCS.o: In function `main':stack.cc:(.text+0x8f): undefined reference to `operator==(stack<int> const&, stack<int> const&)'
collect2: ld returned 1 exit status
Perche' un warning del genere? Di che tipo di errore si tratta?

Riporto, per completezza, i files d'intestazione e prova.

Codice:
// file stack.h 

#include <exception>
#include <iostream>
using namespace std;

// exception classes		
class bad_size {};
class empty {};
class full {};
	
template <class T>
class stack {
	public: 
		// ctors
		explicit stack(unsigned int size) throw(bad_alloc, bad_size) 
			: top(EMPTY), dim(size)
		{ 
			if(size <= 0) 
				throw new bad_size(); 
			elem = new T[dim]; 
		}
		stack(const stack<T> &s) throw(bad_alloc);
		// dtor
		~stack() { delete []elem; }
		// insert
		void push(const T &a) throw(full);
		// remove
		T& pop() throw(empty);
		// reset
		void reset() { top = EMPTY; }
		// check state 
		bool isFull() const { return (top == dim - 1); } 
		bool isEmpty() const { return (top == EMPTY); }
		// print
		void print() const;
		// index of last element
		unsigned int get_top() const { return top; }
		// size of stack
		unsigned int get_dim() const { return dim; }
		// operator overloading
		friend bool operator==(const stack<T> &s1, const stack<T> &s2);
		stack<T>& operator=(const stack &s);

	protected: 
		enum {EMPTY = -1};
		T *elem;
		unsigned int dim, top;
};

template <class T>
stack<T>::stack(const stack<T> &s) throw(bad_alloc)
{
	dim = s.dim;
	top = s.top;
	elem = new T[dim];
	for(int i = 0; i <= top; ++i)
		elem[i] = s.elem[i];
}

template <class T>
void stack<T>::push(const T& a) throw(full)
{
	if(isFull())
		throw new full();
	else
		elem[++top] = a;
}

template <class T>
T& stack<T>::pop() throw(empty)
{
	if(isEmpty())
		throw new empty();
	else
		return (elem[top--]);
}

template <class T>
void stack<T>::print() const
{
	unsigned int index = top;
	
	while(index != EMPTY)
		cout << elem[index--] << endl;
}

template <class T>
bool operator==(const stack<T> &s1, const stack<T> &s2)
{
	bool result = true;
	
	if(s1.get_dim() == s2.get_dim() && s1.get_top() == s2.get_top() && s1.get_top() != s1.EMPTY)
		for(int i = 0; i <= s1.get_top() && result; ++i)
			if(!(s1[i] == s2[i]))
				result = false;
	else 
		result = false;
	return result;
}


template <class T>
stack<T>& stack<T>::operator=(const stack<T> &s)
{
	dim = s.dim;
	top = s.top;
	elem = new T[dim];
	for(int i = 0; i <= top; ++i)
		elem[i] = s.elem[i];
	return *this;
}
Codice:
// file stack.cc

#include "stack.h"

/* semplice test */
int main()
{
	stack<int> s1(10), s2(10);
	
	for(int i = 0; i < 10; ++i) {
		s1.push(i);
		s2.push(i);
	}
		
	if(s1 == s2)
		cout << "s1 = s2\n";
	
	cout << "s1[top] = " << s1.pop() << endl;
}
Grazie anticipatamente per le eventuali risposte!

Ultima modifica di riemann_01 : 23-06-2006 alle 18:20.
riemann_01 è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2006, 10:31   #2
riemann_01
Member
 
Iscritto dal: May 2006
Messaggi: 38
Ho risolto il problema dichiarando la funzione operator==() all'esterno della classe. Questo pero' e' un semplice un workaround, perche' la soluzione adotatta precedentemente non funziona? Nessuno puo' darmi indicazioni a riguardo?
riemann_01 è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2006, 12:05   #3
Black imp
Senior Member
 
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
prova così: dichiara l'operatore == come una funzione a sua volta template e usa al posto di T per chiarezza un'altro nome

friend
template<class S>
bool operator==(const stack<S> &s1, const stack<S> &s2);


onestamente non so dove vada messa la parola 'friend' se prima o dopo template. fai delle prove. sostanzialmente come l'hai definita tu non è una funzione template e quando le passi i due stack<int> non li accetta.


fammi sapere gentilmente perchè mi interessa

Ultima modifica di Black imp : 25-06-2006 alle 12:07.
Black imp è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
iPhone 18 Pro: il componente che garanti...
DeepL alza il livello: con Voice-to-Voic...
Apple sta utilizzando sempre più ...
Il MacBook Neo vende tanto? Microsoft le...
AST SpaceMobile BlueBird 7: Blue Origin ...
È il momento migliore per comprar...
Svendita MacBook Pro: c'è il mode...
Oggi questa TV TCL QLED da 43 pollici co...
Il caricatore multiplo da 200W che va be...
Top 7 Amazon, il meglio del meglio di qu...
Spento lo strumento LECP della sonda spa...
Voyager Technologies ha siglato un accor...
GoPro annuncia la linea MISSION 1 con tr...
Alcune varianti dei futuri Samsung Galax...
Il ridimensionamento di OnePlus in Europ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 04:38.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v