[gnu.g++.bug] problems with unary minus

KEISTER@CARNOT.PHYS.CMU.EDU (01/12/90)

I am running g++ on a VMS VAX, and am having trouble making a unary minus 
operator for a complex 2x2 matrix.  I have set up my own complex class
(Cmplx) with its own unary minus, which compiles and runs correctly, but
g++ doesn't like my treatment of unary minus on the matrix.  The error 
message and the relevant sections of code follow.  This all works correctly 
under cfront on a DECstation, and I don't have g++ installed on any other 
machine to know if this is VMS-specific.

Brad Keister
Physics Department
Carnegie Mellon U


unary.cc: In function class Pauli operator - (const class Pauli &):
unary.cc:63: wrong type argument to unary minus
unary.cc:63: wrong type argument to unary minus
unary.cc:63: wrong type argument to unary minus
unary.cc:63: wrong type argument to unary minus

// self-contained test file...

class Cmplx {
	double re, im;
public:
	Cmplx(double r = 0.0, double i = 0.0) {re = r; im = i;} // ctor
	Cmplx(const Cmplx& z) {re = z.re; im = z.im;}	// copy initializer
	~Cmplx() {}	// dtor (automatic)

//	...

	Cmplx operator-()	// unary -
	{
		return Cmplx(-re, -im);
	}

      };

class Pauli {
	Cmplx s11, s12, s21, s22;
public:
	Pauli(double a = 0);	// ctor (accomodates no-arg case)
		
	Pauli(const Cmplx& ss11, const Cmplx& ss12, 
	      const Cmplx& ss21, const Cmplx& ss22);
		//	specify individual components (no defaults)

	Pauli(const Pauli& a);	// copy initializer
	
	~Pauli() {}	// dtor (automatic)
		
	Pauli& operator=(const Pauli& a);	// assignment

//	...
	
	friend Pauli operator-(const Pauli& a);	// unary -
};

Pauli::Pauli(double a)	// ctor (accomodates no-arg case)
{
	s11 = a; s22 = a; s12 = 0; s21 = 0;
}
		
Pauli::Pauli(const Cmplx& ss11, const Cmplx& ss12, 
	     const Cmplx& ss21, const Cmplx& ss22)
	//	specify individual components (no defaults)
{
	s11 = ss11; s12 = ss12;
	s21 = ss21; s22 = ss22;
}

Pauli::Pauli(const Pauli& a)	// copy initializer
{
	s11 = a.s11; s12 = a.s12; 
	s21 = a.s21; s22 = a.s22;
}
	
Pauli& Pauli::operator=(const Pauli& a)	// assignment
{
	s11 = a.s11; s12 = a.s12; 
	s21 = a.s21; s22 = a.s22; 
	return *this;
}

//	...
	
Pauli operator-(const Pauli& a)	// unary -
{
	return Pauli(-a.s11, -a.s12, -a.s21, -a.s22);
}