Bug 4856 – opDispatch does not work with specified template parameters

Status
RESOLVED
Resolution
INVALID
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2010-09-12T18:09:00Z
Last change time
2010-09-14T17:44:47Z
Assigned to
nobody
Creator
bennygui

Comments

Comment #0 by bennygui — 2010-09-12T18:09:06Z
opDispatch does accept additional template parameters but they cannot be specified: ==== module test.d; import std.stdio; struct DispatchTest {     void opDispatch(string name, string otherName)() {         writeln(name, ":", otherName);     } } void main() {     DispatchTest t;     //t.testName!("testOtherName")();     t.opDispatch!("testName", "testOtherName")(); } ====  This compiles fine but if I remove the commented line, dmd (v2.048) tells  me: test.d(13): Error: template instance opDispatch!("testName") does not match  template declaration opDispatch(string name,string otherName) The error seems OK for a "normal" function, but for opDispatch, it seems  limiting to me: the first call should translate to the second. Here's an other, similar, test: ==== module test.d; import std.stdio; struct DispatchTest {     void opDispatch(string name, T)(T t) {         writeln(name, ":", T.stringof);     } } void main() {     DispatchTest t;     //t.testName!(DispatchTest)(t);     t.testName(t); } ==== Which gives, when uncommenting: test.d(13): Error: template instance opDispatch!("testName") does not match  template declaration opDispatch(string name,T).
Comment #1 by bennygui — 2010-09-14T17:44:47Z
Simen Kjaeraas found a solution: http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=117353 === The correct way to do what you want is this: module foo; import std.stdio; struct test { template opDispatch( string name ) { void opDispatch( string other )( ) { writeln( name, ", ", other ); } } } void main( ) { test t; t.foo!( "Hey!" )( ); } ===