Template error on compiling ...

Robin robbepop at web.de
Fri Feb 28 11:09:09 PST 2014


Hiho,

I am currently working on a matrix library (matrices are 
templated structs) and have just implemented so-called 
"ElementalOperations" which perform certain tasks on mutable 
matrices.

There is an abstract ElementalOperation where three different 
ElementalOperation types inherit from. These ElementalOperations 
are structured like that:

module neoLab.core.ScaleRowOperation;

import neoLab.core.ElementalOperation;
import neoLab.core.Matrix;

final class ScaleRowOperation(T = double) : ElementalOperation
	if (!hasIndirections!T)
{
	private
	{
		size_t row = 0;
		T factor = 1;
	}

	this(size_t row, T factor) pure nothrow {
		this.row = row;
		this.factor = factor;
	}

	override void opCall(ref Matrix m) pure nothrow {
		foreach (immutable col; 0 .. m.getDimension().cols) {
			m[this.row, col] *= this.factor;
		}
	}

	override string toString() const pure nothrow {
		return "Scale all elements of row " ~ this.row ~
				" by factor " ~ this.factor ~ ".";
	}
}

So it is a fairly simple concept until now and I haven't spend 
time on improving its performance as I run into a strange 
compiler error, telling me the following:

neoLab/core/ElementalOperation.d(6): Error: struct 
neoLab.core.Matrix.Matrix(T = double) if (!hasIndirections!T) is 
used as a type
neoLab/core/SwapRowsOperation.d(18): Error: struct 
neoLab.core.Matrix.Matrix(T = double) if (!hasIndirections!T) is 
used as a type

The matrix struct is defined as follows:

struct Matrix(T = double) if (!hasIndirections!T)

In the documentation hasIndirections!T reads:
Returns true if and only if T's representation includes at least 
one of the following:
     - a  raw pointer U*;
     - an array U[];
     - a  reference to a class type C.
     - an associative array.
     - a  delegate.

I don't know why this error occures at all. In my opinion it 
shouldn't, or am I doing something wrong again?

Thanks in advance for help. =)

Robin


More information about the Digitalmars-d-learn mailing list