Debug help - opDispatch - unknown member function
Brother Bill
brotherbill at mail.com
Tue Sep 9 12:04:07 UTC 2025
On Tuesday, 9 September 2025 at 09:59:40 UTC, Dejan Lekic wrote:
>
> Hopefully this slightly modified, and commented version of your
> original code will
> help you understand why your mixin is failing:
>
> ```d
> import std.stdio;
>
> void main() {
> CallLogger!C l;
> l.callA(1, 2);
> l.callB("ABC");
>
> // CallLogger does not have method called "callHome", but
> it has opDispatch, so
> // the compiler will lower this down to
> l.opDispatch("callHome", "foo", "bar")
> l.callHome("foo", "bar");
> }
>
> struct C {
> void callA(int i, int j) {
> }
>
> void callB(string s) {
> }
>
> // Your mixin generates code that calls C.callHome which
> did not exist
> void callHome(string a, string b) {
> writeln(a, "/", b);
> }
> }
>
> struct CallLogger(C) {
> C content;
> void opDispatch(string name, T...)(T vals) {
> writeln("called ", name);
>
> // Now it works, because C now has callHome method
> mixin("content." ~ name)(vals);
> }
> }
> ```
When commenting out the callHome() in struct C, it fails.
Obviously if callHome() is explicitly created, it works.
```
import std.stdio;
void main() {
CallLogger!C l;
l.callA(1, 2);
l.callB("ABC");
// CallLogger does not have method called "callHome", but it
has opDispatch, so
// the compiler will lower this down to
l.opDispatch("callHome", "foo", "bar")
l.callHome("foo", "bar");
}
struct C {
void callA(int i, int j) {
}
void callB(string s) {
}
// Your mixin generates code that calls C.callHome which did
not exist
// void callHome(string a, string b) {
// writeln(a, "/", b);
// }
}
struct CallLogger(C) {
C content;
void opDispatch(string name, T...)(T vals) {
writeln("called ", name);
// Now it works, because C now has callHome method
mixin("content." ~ name)(vals);
}
}
```
Console contents:
```
c:\dev\D\D_templates_tutorial\toy1\source\app.d(10): Error: no
property `callHome` for `l` of type `app.CallLogger!(C)`
l.callHome("foo", "bar");
^
```
More information about the Digitalmars-d-learn
mailing list