https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61745

            Bug ID: 61745
           Summary: template friend for dyadic operator- is only accepted
                    if the monadic operator- follows it
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jarausch at igpm dot rwth-aachen.de

If a template class contains both, the monadic and the dyadic operator-
the friend declaration is only accepted if it preceeds the 
definition of the monadic operator.
This occurs with gcc 4.7.4 4.8.3 and 4.9.0

template <typename INT,INT P> class Zp;

template <typename INT,INT P> 
Zp<INT,P> operator-(const Zp<INT,P>& a, const Zp<INT,P>& b);


template <typename INT,INT P>
class Zp {
public:
  static const INT p = P;
private:


  INT val;

public:

  Zp() : val(0) {}
  Zp( INT x ) : val(x%p) { if (x < 0 ) x+= p; }

// this compiles only if the following definition is moved AFTER the friend
declataion
  Zp  operator-() const { return Zp(p-val); }
  friend Zp<INT,P> operator- <>(const Zp<INT,P>& a, const Zp<INT,P>& b);
/*
Quest_Templ.C:23:28: error: declaration of 'operator-' as non-function
   friend Zp<INT,P> operator- <Zp<>(const Zp<INT,P>& a, const Zp<INT,P>& b);
                            ^
Quest_Templ.C:23:28: error: expected ';' at end of member declaration
Quest_Templ.C:23:30: error: expected unqualified-id before '<' token
   friend Zp<INT,P> operator- <Zp<>(const Zp<INT,P>& a, const Zp<INT,P>& b);

*/
};

Reply via email to