Virtual opBinary in interface
sfp
sfp at hush.ai
Thu Dec 19 18:49:28 UTC 2024
Subject lines says it all, I think... The choice to make binary
operators implementable only via this `opBinary` template means
it's unclear how to get virtual operators on an interface. E.g.,
this toy example *does* compile:
```
interface Scalar {
Scalar opBinary(string op)(Scalar rhs); // wrong
}
class Int : Scalar {
int i;
this(int i) { this.i = i; }
Int opBinary(string op)(Int rhs) if (op == "+") {
return new Int(i + this.i);
}
}
void main() {
Scalar one = new Int(1);
Scalar two = one + one;
}
```
but with linker errors, of course:
```
~[...] $ dmd scratch.d
/usr/bin/ld: scratch.o: in function `_Dmain':
scratch.d:(.text._Dmain[_Dmain]+0x2a): undefined reference to
`_D7scratch6Scalar__T8opBinaryVAyaa1_2bZQtMFCQBqQBlZQi'
collect2: error: ld returned 1 exit status
Error: undefined reference to `scratch.Scalar
scratch.Scalar.opBinary!("+").opBinary(scratch.Scalar)`
referenced from `_Dmain`
perhaps `.d` files need to be added on the command line,
or use `-i` to compile imports
Error: linker exited with status 1
cc scratch.o -o scratch -m64 -Xlinker --export-dynamic
-L/usr/lib64 -Xlinker -Bstatic -lphobos2 -Xlinker -Bdynamic
-lpthread -lm -lrt -ldl
```
Could someone set me straight here? I just want to be able to
define an interface that has some binary ops and then overload
them as needed.
I am very new to D, and my goal is to learn how to solve this
problem using classic, runtime, dynamic polymorphism in D (so,
please don't suggest that I solve a different problem, suggest
that I use a particular library, a different technique, etc.).
Thanks in advance.
More information about the Digitalmars-d-learn
mailing list