digitalmars.D.learn - Template argument deduction
- Tom (23/23) Feb 28 2011 I have...
- =?ISO-8859-1?Q?Ali_=C7ehreli?= (11/34) Feb 28 2011 That's because the type of literals like [1, 2] are slices (dynamic
- bearophile (5/7) Mar 01 2011 Then why is this accepted?
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (10/24) Mar 01 2011 On 03/01/2011 04:30 AM, bearophile wrote:
- Tom (5/33) Mar 02 2011 I should post on D newsgroup. Perhaps Walter or Andrei could enlight us
I have... import std.stdio; int main(string[] args) { foo([[1,2],[3,4],[5,6]]); // ERROR [1] bar([[1,2],[3,4],[5,6]]); // OK foo!int([[1,2],[3,4],[5,6]]); // OK return 0; } void foo(T)(T[2][] t) { writeln(typeid(t)); } void bar(T)(T[][] t) { writeln(typeid(t)); } [1] src\main.d(4): Error: template main.foo(T) does not match any function template declaration src\main.d(4): Error: template main.foo(T) cannot deduce template function from argument types !()(int[][]) Why can't compiler deduce template parameters from arguments in the first instantiation? Thanks in advance, Tom;
Feb 28 2011
On 02/28/2011 07:39 PM, Tom wrote:I have... import std.stdio; int main(string[] args) { foo([[1,2],[3,4],[5,6]]); // ERROR [1] bar([[1,2],[3,4],[5,6]]); // OK foo!int([[1,2],[3,4],[5,6]]); // OK return 0; } void foo(T)(T[2][] t) { writeln(typeid(t)); } void bar(T)(T[][] t) { writeln(typeid(t)); } [1] src\main.d(4): Error: template main.foo(T) does not match any function template declaration src\main.d(4): Error: template main.foo(T) cannot deduce template function from argument types !()(int[][]) Why can't compiler deduce template parameters from arguments in the first instantiation? Thanks in advance, Tom;That's because the type of literals like [1, 2] are slices (dynamic arrays), not fixed-sized arrays. import std.stdio; void main() { writeln(typeof([1,2]).stringof); } The output of that program is int[] Ali
Feb 28 2011
Ali Çehreli:That's because the type of literals like [1, 2] are slices (dynamic arrays), not fixed-sized arrays.Then why is this accepted? foo!int([[1,2],[3,4],[5,6]]); // OK Bye, bearophile
Mar 01 2011
On 02/28/2011 07:39 PM, Tom wrote:foo([[1,2],[3,4],[5,6]]); // ERROR [1] bar([[1,2],[3,4],[5,6]]); // OK foo!int([[1,2],[3,4],[5,6]]); // OK...void foo(T)(T[2][] t) { writeln(typeid(t)); } void bar(T)(T[][] t) { writeln(typeid(t)); }On 03/01/2011 04:30 AM, bearophile wrote:Ali Çehreli:If I have to guess, I think supplying T as int now becomes a problem of matching [1,2] with int[2] and it already works: int[2] a = [1, 2]; int[2][] b = [ [1, 2] ]; I don't know whether the compiler should go the extra mile and help Tom in the original case. :-/ AliThat's because the type of literals like [1, 2] are slices (dynamic arrays), not fixed-sized arrays.Then why is this accepted? foo!int([[1,2],[3,4],[5,6]]); // OK
Mar 01 2011
El 01/03/2011 16:05, Ali Çehreli escribió:On 02/28/2011 07:39 PM, Tom wrote: > foo([[1,2],[3,4],[5,6]]); // ERROR [1] > bar([[1,2],[3,4],[5,6]]); // OK > foo!int([[1,2],[3,4],[5,6]]); // OK ... > void foo(T)(T[2][] t) { > writeln(typeid(t)); > } > > void bar(T)(T[][] t) { > writeln(typeid(t)); > } On 03/01/2011 04:30 AM, bearophile wrote: > Ali Çehreli: > >> That's because the type of literals like [1, 2] are slices (dynamic >> arrays), not fixed-sized arrays. > > Then why is this accepted? > > foo!int([[1,2],[3,4],[5,6]]); // OK If I have to guess, I think supplying T as int now becomes a problem of matching [1,2] with int[2] and it already works: int[2] a = [1, 2]; int[2][] b = [ [1, 2] ]; I don't know whether the compiler should go the extra mile and help Tom in the original case. :-/ AliI should post on D newsgroup. Perhaps Walter or Andrei could enlight us about this. Thanks, Tom;
Mar 02 2011