From: jakarppi AT paju DOT oulu DOT fi (Jari Karppinen) Newsgroups: comp.os.msdos.djgpp Subject: Trouble with templates and gcc-2.95 Date: 20 Sep 1999 12:09:59 GMT Organization: University of Oulu, Department of Mathematical Sciences Lines: 306 Message-ID: <7s586n$k60$1@ousrvr3.oulu.fi> NNTP-Posting-Host: paju.oulu.fi Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Trace: ousrvr3.oulu.fi 937829399 20672 130.231.240.20 (20 Sep 1999 12:09:59 GMT) X-Complaints-To: news AT news DOT oulu DOT fi NNTP-Posting-Date: 20 Sep 1999 12:09:59 GMT X-Newsreader: TIN [UNIX 1.3 unoff BETA release 960807] To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I wrote a simple templatized vector class. There was no trouble compiling the source with egcs-1.1.2, but after I switched to gcc-2.95, I got the following: vec.cc: In instantiation of `Vector': vec.cc:285: instantiated from here vec.cc:44: invalid use of undefined type `class Vector' vec.cc:48: forward declaration of `class Vector' vec.cc:44: confused by earlier errors, bailing out I made no changes to the source, and can't see why this happens. I would really appreciate advice from experts. -- vec.cc: #include #include #include #include template class Vector { private: unsigned size_; T *data; private: void init(unsigned); void copy(const T *); void destroy(); public: Vector(); Vector(unsigned); Vector(unsigned, const T&); Vector(unsigned, const T *); Vector(unsigned, const char *); Vector(const Vector&); Vector(istream&); ~Vector(); Vector& operator = (const Vector&); const T& operator() (unsigned) const; T& operator() (unsigned); friend ostream& operator << <> (ostream&, const Vector&); friend istream& operator >> <> (istream&, Vector&); unsigned size() const; void resize(unsigned); void fill(const T&); Vector operator - (); Vector& operator += (const Vector&); Vector& operator -= (const Vector&); Vector& operator *= (const T&); Vector& operator /= (const T&); friend Vector operator + <> (const Vector&, const Vector&); friend Vector operator - <> (const Vector&, const Vector&); friend Vector operator * <> (const Vector&, const T&); friend Vector operator * <> (const T&, const Vector&); friend Vector operator / <> (const Vector&, const T&); }; template inline void Vector::init(unsigned size) { data = new T[size_ = size]; } template inline void Vector::copy(const T *v) { for (unsigned i = 0; i < size_; i++) { data[i] = v[i]; } } template inline void Vector::destroy() { delete[] data; data = 0; } template Vector::Vector() { size_ = 0; data = 0; } template Vector::Vector(unsigned size) { init(size); } template Vector::Vector(unsigned size, const T& filler) { init(size); fill(filler); } template Vector::Vector(unsigned size, const T *v) { init(size); copy(v); } template Vector::Vector(unsigned size, const char *v) { istrstream s(v, strlen(v)); init(size); for (unsigned i = 0; i < size; i++) { s >> data[i]; } } template Vector::Vector(const Vector& vector) { init(vector.size()); copy(vector.data); } template Vector::Vector(istream& s) { unsigned size; s >> size; init(size); for (unsigned i = 0; i < size; i++) { s >> data[i]; } } template Vector::~Vector() { destroy(); } template Vector& Vector::operator = (const Vector& vector) { if (this == &vector) return *this; resize(vector.size()); copy(vector.data); return *this; } template inline const T& Vector::operator() (unsigned i) const { return data[i]; } template inline T& Vector::operator() (unsigned i) { return data[i]; } template ostream& operator << (ostream& s, const Vector& vector) { s << vector.size() << endl; for (unsigned i = 0; i < vector.size(); i++) { s << vector(i) << " "; } s << endl; return s; } template istream& operator >> (istream& s, Vector& vector) { unsigned size; s >> size; vector.resize(size); for (unsigned i = 0; i < size; i++) { s >> vector(i); } return s; } template inline unsigned Vector::size() const { return size_; } template void Vector::resize(unsigned size) { if (size_ != size) { destroy(); init(size); } } template void Vector::fill(const T& filler) { for (unsigned i = 0; i < size_; i++) { data[i] = filler; } } template Vector Vector::operator - () { Vector result(size_); for (unsigned i = 0; i < size_; i++) { result.data[i] = -data[i]; } return result; } template Vector& Vector::operator += (const Vector& vector) { for (unsigned i = 0; i < size_; i++) { data[i] += vector(i); } return *this; } template Vector& Vector::operator -= (const Vector& vector) { for (unsigned i = 0; i < size_; i++) { data[i] -= vector(i); } return *this; } template Vector& Vector::operator *= (const T& x) { for (unsigned i = 0; i < size_; i++) { data[i] *= x; } return *this; } template Vector& Vector::operator /= (const T& x) { for (unsigned i = 0; i < size_; i++) { data[i] /= x; } return *this; } template Vector operator + (const Vector& A, const Vector& B) { Vector result = A; result += B; return result; } template Vector operator - (const Vector& A, const Vector& B) { Vector result = A; result -= B; return result; } template Vector operator * (const Vector& A, const T& x) { Vector result = A; result *= x; return result; } template Vector operator * (const T& x, const Vector& A) { Vector result = A; result *= x; return result; } template Vector operator / (const Vector& A, const T& x) { Vector result = A; result /= x; return result; } template T dot(const Vector& x, const Vector& y) { T result(0); for (unsigned i = 0; i < x.size(); i++) { result += x(i) * y(i); } return result; } template T norm(const Vector& x) { return sqrt(dot(x, x)); } template void normalize(Vector& x) { x /= norm(x); } int main() { Vector vec(5); vec.fill(0); cout << vec << endl; }