Newsgroup: it.comp.os.linux.development
Titolo: undefined reference to e g++, non capisco cosa succede

Ciao a tutti,
da un pò di tempo studio il c++ nel tempo libero per passione, e
fin'ora grazie al manuale di Stroustrup non ho avuto grossissimi
problemi. Il c++ è davvero un bel linguaggio. Ma veniamo a noi. Sono
al capitolo dei vettori ed ho deciso di testare le mie capacità
implementando una piccola classe vector che fa in modo spartano quello
che fa la classe std::Vector delle standard library. Il risultato è
questo (lasciate perdere lo zucchero sintattico, sono alle prime
armi :D ):
vector.h:
#include <cstddef>
template<class T> class vector {
	T* v; // v is the vector of elements
	size_t n; // number of elements to controll the vector
public:
	explicit vector(std::size_t); // basic constructor initialize a
vector of size_t * T
	inline T& operator[](const unsigned int i) const { return v[i]; }; //
subscript operator
	vector& operator=(const vector<T>&); // copy operator
	inline unsigned int size() { return n; }
	void push(T); // provide push
	T pop(); // provide pop
};
vector.cpp
#include "vector.h"
template<class T> vector<T>::vector(std::size_t t)
{
	n = t; // number of elements
	v = new T[n](); // allocation of n elements of type n
}
template<class T> vector<T>& vector<T>::operator=(const vector<T>& o)
{
	if(n != o.n) {
		delete[] v;
		n = o.n;
		v = new T(n);
	}
	for(unsigned int i=0; i<n; i++)
		(*this)[i] = o[i];
	return *this;
}
template<class T> void vector<T>::push(T element)
{
	vector<T>* temp = new vector<T>(this->n +1);
	for(unsigned int i=0; i<this->n; i++)
		temp->v[i] = v[i];
	temp->v[temp->n -1] = element;
	*this = *temp;
}
Il problema sorge quando tento di usare la libreria in un programma e
per esempio nel main:
main.cpp:
#include <iostream>
#include "vector.h"
//#include "vector.cpp"
int main()
{
	vector<int> vi(0);
	vi.push(3);
	vi.push(5);
	vi.push(0);
	const unsigned int max = vi.size();
	std::cout << "Your vector is { ";
	for(unsigned int i=0; i<max; i++)
		std::cout << vi[i] << ' ';
	std::cout << "}.\n";
}
Se provo a compilare lanciando il comando:
  g++ vector.h vector.cpp main.cpp -o main
il risultato è:
/tmp/cccpQTLW.o: In function `main':
main.cpp:(.text+0x19c): undefined reference to
`vector<int>::vector(unsigned int)'
main.cpp:(.text+0x1af): undefined reference to
`vector<int>::push(int)'
main.cpp:(.text+0x1c2): undefined reference to
`vector<int>::push(int)'
main.cpp:(.text+0x1d5): undefined reference to
`vector<int>::push(int)'
collect2: ld returned 1 exit status
che però mi sembra assurdo. Non contento ho provato ad includere la
libreria con l'opzione g++ -L./ e non è servito a nulla, oppure a
creare prima i .o di vector.cpp e main.cpp e poi compilarli con un g++
vector.o main.o -o main ma il risultato è sempre negativo. Ho letto
tanti altri post come il mio, se scrivo non è per pigrizia ma non ho
trovato nulla che mi riguardasse. Spero di non farvi sprecare tempo e
risorse,
ciao a tutti,
Mario

   g++ vector.h vector.cpp main.cpp -o main
non so se hai aggiunto vector.h solo per fare una prova disperata, ma
passare i file header al compilatore e' sbagliato concettualmente.
Saluti,
The Librarian
PS: per domande riguardanti il C++ standard ti conviene chiedere su
it.comp.lang.c++ dove sono sicuramente piu' esperti. Invece, per
qualsiasi cosa riguardi la programmazione su linux questo e' il luogo
piu' adatto per porre domande.