This is the mail archive of the cygwin@sourceware.cygnus.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Linking problems with templates.


"Chalapathi R. Emani" <cemani@qualcomm.com> writes:
> 
> Hi,
> 
> I am trying to use the latest version from  cygwin and 
> I am having linking problems with a file that uses templates:
> 
> When I compiled one of the source  file I got the following warnings:
> 
> Config.h:178: warning: friend declaration `class istream & operator >>(class
> ream &, class OrderedTriple<T> &)'
> Config.h:178: warning:   declares a non-template function
> Config.h:178: warning:   (if this is not what you intended, make sure
> Config.h:178: warning:   the function template has already been declared,
> Config.h:178: warning:   and add <> after the function name here)
> Config.h:179: warning: friend declaration `class ostream & operator
> <<(class ost
> ream &, class OrderedTriple<T> &)'
[ ... ]

This is a change in the standard that had caught most (all?) of us
who've had C++ code dating back years. You need to fix the code, and
there's really no easy way out. 

How to keep compatibility with other compilers? Well, I usually use
configure-driven systems, and I wrote a simple autoconf macro (now
also used by other packages such as GNU Octave) that checks for if
your C++ compiler supports friend template declaration or not, and
if not, defines a pre-processor macro to support older compilers
(such as GCC-2.8.1 or MSVC 6.x).

I believe this was added in egcs-1.1 (egcs-2.91.57), but I may be off 
by a release.

Here's an example:

  # ifdef CXX_NO_FRIEND_TMPL_DECL
  #   define LTGT
  # else
  #   define LTGT <>
  # endif

Then in the code:

  // must forward class and friend functions 
  template <typename T>
  class Foo;

  template <typename T> Foo<T>&
  operator += (Foo<T>&, const T&);

  template <class T>
  class Foo 
  {
  public:

    // ...
    friend Foo<T>& operator += LTGT (Foo<T>&, const T&);
    // ...
  };

For new compilers, nothing needs to be done. For old ones, define the
macro CXX_NO_FRIEND_TMP_DECL when compiling.

> 
> I went ahead and compiled this with the flag "-fguiding-decls"   and these
> warnings have gone away.
> Then I tried linking this with the rest of the objects and libstdc++.a and
> I am getting the following 
> errors:

Well, unfortunately -fguiding-decls really doesn't work when there are
libraries involved. I suppose with lots of extra work, it could be made
to work always, but I doubt it'll be done unless someone contributes
the changes.

> 
> On Solaris when I use the "-fguiding-decls"  option  and compile and link
> it, it builds just fine.
> May be because I use 2.8.1 on Solaris.

2.8.1 didn't really support many of the new C++ standard features, so it's
not surprising.

> 
> Do you know if the above option has been deprecated in   Cygwin 2.95.2  ?
> 

Not deprecated, just full of pitfalls.

For more details of template friends, see Section 14.5.3 [temp.friend]/1
in the C++ ISO standard document.

Regards,
Mumit


--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]