friend template

Ruslan Shevchenko Ruslan@Shevchenko.Kiev.UA
Thu Dec 17 20:35:00 GMT 1998


Naoki Saito wrote:

> Dear ecgs developers,
>
> I encountered the following problem and would like to know whether there
> is any
> workaround.  I followed exactly the same way as the FAQ (Friend
> templates) suggests.
> * ecgs version: 1.1b ( g++ --version produces egcs-2.91.57)
> * OS linux 2.1.129
> * commands
>  $ g++ -o test test_main.cc test.cc
> Error:
> /tmp/ccozF3uA.o: In function `main':
> /tmp/ccozF3uA.o(.text+0x8d): undefined reference to `float
> sum<float>(Data<float> const &)'
> collect2: ld returned 1 exit status
>

move it to .h


>
> I would greatly appreciate your help!
>
> Here is a programs (I have 3 very short files here).
>
> //==============================================================
> // test_main.cc
> #include "test.h"
>
> main()
> {
>   Data<float> A(10);
>   int i;
>   for (i = 0; i < 9; i++)
>     A[i] = float(i);
>
>   cout << "A.sum() = " << A.sum() << endl;
>   cout << "sum(A) = " << sum(A) << endl;
> }
>
> //==============================================================
> // test.h
> #include <math.h>
> #include <stream.h>
>
> template <class DT>
> class Data;
>
> template <class DT>
> DT sum(const Data<DT>&);
>
> template <class DT>
> class Data
> {
> protected:
>  int len;
>  DT *s;
> public:
>   Data() : len(0), s(0) {}
>   Data(int n) : len(n), s(new DT[n]) {}
>   virtual ~Data() { if (s != NULL) delete s; }
>   int length() const { return len; }
>   DT& operator[](int i) const { return s[i]; }
>   DT sum() const;
>   friend DT sum<>(const Data<DT>&);
> };
>
> //==============================================================
> // test.cc
>
> #include "test.h"
>
> template Data<float>;
> template Data<double>;
> template Data<int>;
>
> // This is a membership function
> template <class DT> DT Data<DT>::sum() const
> {
>   DT res = 0;
>   DT* top = &(s[len]);
>   DT* t = s;
>   while (t < top) res += *t++;
>   return res;
> }
>
> // This is a friend function
> template <class DT> DT sum(const Data<DT>& A)
> {
>   DT res = 0;
>   DT* top = &(A.s[A.len]);
>   DT* t = A.s;
>   while (t < top) res += *t++;
>   return res;
> }
>
> --
>  Naoki Saito, Ph.D., Associate Professor, Department of Mathematics
>  University of California, One Shields Avenue, Davis, CA 95616-8633 USA




More information about the Gcc-bugs mailing list