www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - container vs standard array

reply vino <akashvino79 gmail.com> writes:
Hi All,

  I am trying to understand as to why the below code is throwing 
error

Code
```
import std.stdio: writeln;
import std.container.array;

void main () {
  //auto a = Array!string("Aname");           // throws error
  auto b = Array!char("Bname");             	// works
  auto c = Array!string("Aname", "Bname");  	// works

  //writeln(a);
  writeln("Container Array :", b);
  writeln("Container Array :", c);

  writeln();

  string[] d = ["Dname"];			       // works
  string[] e = ["Dname", "Ename"];              // works
  writeln("Standard Array :", d);
  writeln("Standard Array :", e);

}
```
From,
Vino
Sep 18 2023
parent reply JG <jg jg.com> writes:
On Tuesday, 19 September 2023 at 00:34:01 UTC, vino wrote:
 Hi All,

  I am trying to understand as to why the below code is throwing 
 error

 Code
 ```
 import std.stdio: writeln;
 import std.container.array;

 void main () {
  //auto a = Array!string("Aname");           // throws error
  auto b = Array!char("Bname");             	// works
  auto c = Array!string("Aname", "Bname");  	// works

  //writeln(a);
  writeln("Container Array :", b);
  writeln("Container Array :", c);

  writeln();

  string[] d = ["Dname"];			       // works
  string[] e = ["Dname", "Ename"];              // works
  writeln("Standard Array :", d);
  writeln("Standard Array :", e);

 }
 ```
 From,
 Vino
Looks to me like when it receives a single range it expects the elements of that range to match the type. If I am correct in the first one if you replace the "Aname" by ["Aname"] it should work
Sep 18 2023
parent reply Nick Treleaven <nick geany.org> writes:
On Tuesday, 19 September 2023 at 06:35:01 UTC, JG wrote:
 On Tuesday, 19 September 2023 at 00:34:01 UTC, vino wrote:
  //auto a = Array!string("Aname");           // throws error
  auto b = Array!char("Bname");             	// works
  auto c = Array!string("Aname", "Bname");  	// works
...
 Looks to me like when it receives a single range it expects the 
 elements of that range to match the type.
Yes, the first overload fails to match because U is inferred as immutable(char) rather than string: this(U)(U[] values...) if (isImplicitlyConvertible!(U, T)) This is because a single array can be passed to a typesafe variadic parameter rather than elements of that array type. And then immutable(char) doesn't convert to string. I think a non-variadic overload could be added to make it work as expected.
Sep 19 2023
parent reply Nick Treleaven <nick geany.org> writes:
On Tuesday, 19 September 2023 at 19:57:34 UTC, Nick Treleaven 
wrote:
 This is because a single array can be passed to a typesafe 
 variadic parameter rather than elements of that array type. And 
 then immutable(char) doesn't convert to string.

 I think a non-variadic overload could be added to make it work 
 as expected.
https://github.com/dlang/phobos/pull/8818
Sep 19 2023
parent vino <akashvino79 gmail.com> writes:
On Tuesday, 19 September 2023 at 20:20:17 UTC, Nick Treleaven 
wrote:
 On Tuesday, 19 September 2023 at 19:57:34 UTC, Nick Treleaven 
 wrote:
 This is because a single array can be passed to a typesafe 
 variadic parameter rather than elements of that array type. 
 And then immutable(char) doesn't convert to string.

 I think a non-variadic overload could be added to make it work 
 as expected.
https://github.com/dlang/phobos/pull/8818
Thank you very much.
Sep 19 2023