Torna indietro   Hardware Upgrade Forum > Software > Programmazione

TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
La tecnologia SQD-Mini LED di TCL arriva sul taglio da 65 pollici con la serie C8L: 2040 zone, pannello WHVA 2.0 e un picco che alle rilevazioni delle sonde tocca i 4400 nit nel profilo Filmmaker e un HDR quasi perfetto
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro
Wireless 2.4 GHz, Bluetooth 5.4, cancellazione attiva del rumore, design pieghevole e un'autonomia che mette in imbarazzo prodotti che costano il doppio. Le Maestro 500 non eccellono in nulla, ma offrono tutto. E a questo prezzo è difficile chiedere di più
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
Dopo anni di attesa e una lunga fase di sviluppo, Noctua entra nel mercato dei dissipatori a liquido AIO con la nuova serie NL-LC1. Forte dell'esperienza maturata nel raffreddamento ad aria, l'azienda austriaca promette di portare la propria filosofia fatta di qualità costruttiva, attenzione ai dettagli e silenziosità anche in questo segmento. Abbiamo provato il nuovo sistema per scoprire se riesce a distinguersi in un mercato ormai molto competitivo.
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


TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati TCL 65C8L, la recensione del SQD-Mini LED da 440...
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro MSI Maestro 500 Wireless: ANC e 90 ore di autono...
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con ...
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
I lander lunari della missione Artemis I...
SteamOS 3.8 esce dalla beta: supporto pr...
HDMI 2.2 si avvicina: i primi dispositiv...
GTA 6 è sempre più vicino:...
Prima mossa climatica di Anthropic: entr...
Ho scritto un programma da zero con Kimi...
Thermal Grizzly DeltaMate CPU Block: un ...
Il supercomputer più potente al m...
VSCO lancia Studio Pro su iOS: batch edi...
GPT-NL, il modello linguistico olandese ...
Apple Watch SE 3 crolla a 199€: il prezz...
'Non c'è spazio per console econo...
AutoUncle fotografa il mercato dell'usat...
Robase, il malware che ruba interi gioch...
DeepSeek invece di OpenAI in Copilot Cow...
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: 05:09.


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