Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
October 23, 2002 template friend member | ||||
---|---|---|---|---|
| ||||
i'm having trouble figuring out how to use a member function in a header provided like this... template <class T> class foo { public: friend int friendfunc(foo<char> &); // etc... i need to define this function in a separate file, and i'm having a problem with the linker finding this function. anybody know offhand the way to implement and link this? for instance i have: foo.h // header foo.cpp // implementation friend.cpp // friendfunc code main.cpp // the app i've #included the foo.cpp and everything about this template works just fine except this one dang function... everything i do i get Symbol Undefined error from the linker. i hate to give up, any ideas? thanks, bw |
October 23, 2002 Re: template friend member | ||||
---|---|---|---|---|
| ||||
Posted in reply to bw | In foo.cpp, you'll need a reference to the template in order to cause its instantiation. "bw" <bw_member@pathlink.com> wrote in message news:ap53g6$eti$1@digitaldaemon.com... > i'm having trouble figuring out how to use a member function in a header provided like this... > > template <class T> > class foo > { > public: > friend int friendfunc(foo<char> &); > // etc... > > i need to define this function in a separate file, and i'm having a problem with > the linker finding this function. anybody know offhand the way to implement and > link this? > > for instance i have: > foo.h // header > foo.cpp // implementation > friend.cpp // friendfunc code > main.cpp // the app > > i've #included the foo.cpp and everything about this template works just fine > except this one dang function... everything i do i get Symbol Undefined error > from the linker. > > i hate to give up, any ideas? > > thanks, > bw > > |
October 23, 2002 Re: template friend member | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter | In article <ap6hf1$2d41$2@digitaldaemon.com>, Walter says... > >In foo.cpp, you'll need a reference to the template in order to cause its instantiation. here's a small example, it's no big deal, just curious... this is part of a project from a friend's cs255 class. if ya have time to help thanks walter, brian //foo.h #ifndef FOO_H #define FOO_H template<class T> class foo { public: foo(); friend int ff(foo<char> &); private: char d[1]; }; #endif // foo.cpp #include "foo.h" template<class T> foo<T>::foo() { d[0]='$'; } // ff.cpp #include "foo.h" int ff(foo<char> &f) { int t=f.d[0]; return t; } // main.cpp #include <iostream.h> #include "foo.cpp" #include "ff.cpp" int main() { foo<char> X; int x=ff(X); cout << x; return 0; } C:\cpp\tpl\f>sc main link main,,,user32+kernel32/noi; OPTLINK (R) for Win32 Release 7.50B1 Copyright (C) Digital Mars 1989 - 2001 All Rights Reserved main.obj(main) Error 42: Symbol Undefined ?ff@@YAHAAV?$foo@D@@@Z (int cdecl ff(foo<char > &)) --- errorlevel 1 |
October 23, 2002 Re: template friend member | ||||
---|---|---|---|---|
| ||||
Posted in reply to bw | Put in foo.cpp the following: foo<char> x; The trick is the compiler, in ff.cpp and main.cpp, does not have the template definition so cannot instantiate the template. In foo.cpp, the compiler doesn't know about the uses of foo in ff.cpp and main.cpp, and in foo.cpp the compiler doesn't know what types to instantiate it with. "bw" <bw_member@pathlink.com> wrote in message news:ap6mgp$2its$1@digitaldaemon.com... > In article <ap6hf1$2d41$2@digitaldaemon.com>, Walter says... > > > >In foo.cpp, you'll need a reference to the template in order to cause its instantiation. > > here's a small example, it's no big deal, just curious... this is part of a > project from a friend's cs255 class. > if ya have time to help thanks walter, > brian > > //foo.h > #ifndef FOO_H > #define FOO_H > template<class T> > class foo > { > public: > foo(); > friend int ff(foo<char> &); > private: > char d[1]; > }; > #endif > > // foo.cpp > #include "foo.h" > template<class T> > foo<T>::foo() > { > d[0]='$'; > } > > // ff.cpp > #include "foo.h" > int ff(foo<char> &f) > { > int t=f.d[0]; > return t; > } > > // main.cpp > #include <iostream.h> > #include "foo.cpp" > #include "ff.cpp" > > int main() > { > foo<char> X; > int x=ff(X); > cout << x; > return 0; > } > > C:\cpp\tpl\f>sc main > link main,,,user32+kernel32/noi; > OPTLINK (R) for Win32 Release 7.50B1 > Copyright (C) Digital Mars 1989 - 2001 All Rights Reserved > > main.obj(main) > Error 42: Symbol Undefined ?ff@@YAHAAV?$foo@D@@@Z (int cdecl ff(foo<char > &)) > > --- errorlevel 1 > > > |
October 23, 2002 Re: template friend member | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter | In article <ap6q8k$2o0l$1@digitaldaemon.com>, Walter says... > >Put in foo.cpp the following: > > foo<char> x; that does it thanks, anybody called you a genius lately? L8r, bw |
October 23, 2002 Re: template friend member | ||||
---|---|---|---|---|
| ||||
Posted in reply to bw | The eponymous term of ultimate respect is "compiler-walter" :) "bw" <bw_member@pathlink.com> wrote in message news:ap6qp3$2on8$1@digitaldaemon.com... > In article <ap6q8k$2o0l$1@digitaldaemon.com>, Walter says... > > > >Put in foo.cpp the following: > > > > foo<char> x; > > that does it thanks, anybody called you a genius lately? > > L8r, > bw > > |
October 23, 2002 Re: template friend member | ||||
---|---|---|---|---|
| ||||
Posted in reply to Matthew Wilson | Walter is not a person... He is a team...
Matthew Wilson wrote:
> The eponymous term of ultimate respect is "compiler-walter"
>
> :)
>
> "bw" <bw_member@pathlink.com> wrote in message news:ap6qp3$2on8$1@digitaldaemon.com...
> > In article <ap6q8k$2o0l$1@digitaldaemon.com>, Walter says...
> > >
> > >Put in foo.cpp the following:
> > >
> > > foo<char> x;
> >
> > that does it thanks, anybody called you a genius lately?
> >
> > L8r,
> > bw
> >
> >
|
Copyright © 1999-2021 by the D Language Foundation