digitalmars.D.learn - template instance does not match template declaration
- kdevel (35/35) Feb 25 2022 ```
- kdevel (11/20) Feb 25 2022 Will not compile with selective import commented out. Hence
- Paul Backus (17/20) Feb 25 2022 I'd call this a bug. Currently, selective imports are implemented
- kdevel (19/35) Feb 25 2022 What about this:
- Paul Backus (4/21) Feb 25 2022 I'm not familiar enough with the details of this part of the
```
$ dmd --version
DMD64 D Compiler v2.098.1
[...]
```
```main.d
module main; // main.d
import std.traits;
import model;
void main ()
{
    enum Q = Parameters!read;
}
```
```model.d
module model; // model.d
import std.file : read; // this line provokes the error
int read (string filename)
{
    import std.file;
    auto data = std.file.read (filename);
    return 0;
}
```
```
$ dmd -i main
main.d(7): Error: template instance `model.Parameters!(read)` 
does not match template declaration `Parameters(func...)`
   with `func = (read)`
   must satisfy the following constraint:
`       isCallable!func`
```
It seems the template parameter f becomes not aliased to 
model.read in the presence of the selective import. Bug or 
feature?
 Feb 25 2022
 ```main.d
 module main; // main.d
 import std.traits;
 import model;
 void main ()
 {
    enum Q = Parameters!read;
 }
 ```
Will not compile with selective import commented out. Hence 
main.d must read (alias instead of enum):
```main.d
module main; // main.d
import std.traits;
import model;
void main ()
{
    alias Q = Parameters!(read);
}
```
 Feb 25 2022
On Friday, 25 February 2022 at 23:05:00 UTC, kdevel wrote:It seems the template parameter f becomes not aliased to model.read in the presence of the selective import. Bug or feature?I'd call this a bug. Currently, selective imports are implemented using `alias`es under the hood, which means that the compiler sees your `model` module as having *two* overloads of `read`: ```d alias read = std.file.read; // from selective import int read (string filename) { // etc. } ``` When you pass an overload set to a template that isn't written to handle multiple overloads, it will usually just choose whichever overload comes first in the source code. And since the `public import` statement comes earlier in your source file than the definition of `read`, the `std.file.read` alias is the one that gets chosen when you write `Parameters!read`.
 Feb 25 2022
On Friday, 25 February 2022 at 23:17:14 UTC, Paul Backus wrote:
[...]
 Currently, selective imports are implemented using `alias`es 
 under the hood, which means that the compiler sees your `model` 
 module as having *two* overloads of `read`:
 ```d
 alias read = std.file.read; // from selective import
 int read (string filename)
 {
     // etc.
 }
 ```
 When you pass an overload set to a template that isn't written 
 to handle multiple overloads, it will usually just choose 
 whichever overload comes first in the source code. And since 
 the `public import` statement comes earlier in your source file 
 than the definition of `read`, the `std.file.read` alias is the 
 one that gets chosen when you write `Parameters!read`.
What about this:
```d
module model; // model.d
import std.file : read; // this line provokes the error
private int read (string filename) // now it's private
{
    import std.file;
    auto data = std.file.read (filename);
    return 0;
}
```
Now dmd reports:
```
main.d(7): Error: undefined identifier `read`
```
Is the lookup and the processing done in different parts/stages 
of the compiler?
 Feb 25 2022
On Friday, 25 February 2022 at 23:34:59 UTC, kdevel wrote:
 What about this:
 ```d
 module model; // model.d
 import std.file : read; // this line provokes the error
 private int read (string filename) // now it's private
 {
    import std.file;
    auto data = std.file.read (filename);
    return 0;
 }
 ```
 Now dmd reports:
 ```
 main.d(7): Error: undefined identifier `read`
 ```
 Is the lookup and the processing done in different parts/stages 
 of the compiler?
I'm not familiar enough with the details of this part of the 
compiler to say. But it sure looks like there's something screwy 
going on here.
 Feb 25 2022








 
  
  
 
 kdevel <kdevel vogtner.de>
 kdevel <kdevel vogtner.de> 