Thread overview
Trouble with template parameter matching
Aug 02, 2015
tcak
Aug 02, 2015
Fusxfaranto
Aug 02, 2015
anonymous
August 02, 2015
[code]
void func1(N)( const N name )
	if( is(N: string) || is(N: char[]) )
{
	func2( name );
}

void func2(N)( const N name )
	if( is(N: string) || is(N: char[]) )
{}

void main(){
	char[] blah = ['b', 'l', 'a', 'h'];

	func1( blah );
	//func1( "blah" );	// this works
}
[/code]

[result]
test.d(4): Error: template test.func2 cannot deduce function from argument types !()(const(char[])), candidates are:
test.d(7):        test.func2(N)(const N name) if (is(N : string) || is(N : char[]))
[/result]

When func1 is called with blah variable, I assume that N is char[].

From there, when func2 is called by func1, name should be const(char[]).

But since func2 defined name parameter with const, shouldn't the compiler accept const part of const(char[]) as func2's const, and accept N as char[] still?

Otherwise, it is being weirdly recursive, and requires casting.
August 02, 2015
On Sunday, 2 August 2015 at 08:08:05 UTC, tcak wrote:
> [code]
> void func1(N)( const N name )
> 	if( is(N: string) || is(N: char[]) )
> {
> 	func2( name );
> }
>
> [...]

This seems like the reasonable behavior to me.  Perhaps you should use Unqual?
http://dlang.org/phobos/std_traits.html#Unqual

August 02, 2015
On Sunday, 2 August 2015 at 08:08:05 UTC, tcak wrote:
> [code]
> void func1(N)( const N name )
> 	if( is(N: string) || is(N: char[]) )
> {
> 	func2( name );
> }
>
> void func2(N)( const N name )
> 	if( is(N: string) || is(N: char[]) )
> {}
>
> void main(){
> 	char[] blah = ['b', 'l', 'a', 'h'];
>
> 	func1( blah );
> 	//func1( "blah" );	// this works
> }
> [/code]
>
> [result]
> test.d(4): Error: template test.func2 cannot deduce function from argument types !()(const(char[])), candidates are:
> test.d(7):        test.func2(N)(const N name) if (is(N : string) || is(N : char[]))
> [/result]
>
> When func1 is called with blah variable, I assume that N is char[].

Yup.

> From there, when func2 is called by func1, name should be const(char[]).

Yup.

> But since func2 defined name parameter with const, shouldn't the compiler accept const part of const(char[]) as func2's const, and accept N as char[] still?

Nope. When removing the top level const of `const(char[])`, it becomes `const(char)[]`. Test for that in your template constraint and it works.