Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-06-2006, 17: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 19:20.
riemann_01 è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2006, 11: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, 13: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 13:07.
Black imp è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
WINDTRE si mette in proprio: vender&agra...
The Mandalorian & Grogu: il trailer ...
OpenClaw sotto attacco: i malware infost...
Resident Evil Requiem: pre-load dal 25 f...
Vaticano, la Messa si traduce in 60 ling...
Kia prepara il facelift della Kia EV5: n...
La nuova Alpine A110 elettrica sfrutterà...
Il nuovo entry level della gamma MacBook...
Panasonic 55'' QLED con Dolby Vision e F...
TOP 250 PLUS e TOP 300 PLUS ritornano: v...
Incentivi auto elettriche, si va verso r...
Crimson Desert non è un Soulslike...
Sostituzione caldaia con nuovi sistemi, ...
La Germania verso il divieto e il ban de...
Questo super TV Samsung OLED da 65'' con...
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: 16:04.


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