alias using Complex!Double in module ... linker error??

Mike Parker aldacron at gmail.com
Wed Aug 4 01:10:15 UTC 2021


On Tuesday, 3 August 2021 at 21:40:09 UTC, james.p.leblanc wrote:
> I am getting linker errors with this stripped-down example:
>
> -------------------------------------------
> **my_main.d:**
>
> import std.stdio;
> import std.complex;
> import my_module;
>
>
>     void main(){
>           my_TYPE xxx;
>           writeln(xxx);
>     }
>
> -------------------------------------------
> **my_module.d:**
>
> module my_module;
>
> import std.complex;
>
> alias my_TYPE = Complex!double;    *// this causes link error: 
> "undefined reference"*
>
> /* alias my_TYPE = double; */      *// this works fine*
>
> ------------------------------------------
>
> Why does the linker fail when I alias to the Complex!double ...
> but would work fine when alias to the double ??
>
> Any help to understand what is greatly appreciated.
> James

The alias to Complex!double is a template instantiation. A 
template instantiation creates a symbol that needs to be linked. 
So you need to compile my_module.d along with my_main.d.

```
dmd my_main.d my_module.d
```

Or alternatively:

```
dmd -i my_main.d
```

double is a built-in type, so that alias doesn't create any 
symbols that need linking.

An alias in and of itself is a compile-time-only construct, but 
the symbols you assign it might require linking something.


More information about the Digitalmars-d-learn mailing list