On Tue, 11 Aug 2009 19:35:40 -0400, Jesse Phillips
<[email protected]> wrote:
I am trying to obtain a rang that is the intersection of two other
ranges. To do this I am using the _setIntersection()_ function.
import std.algorithm;
import std.stdio;
struct S {
string label;
}
void main() {
auto s1 = new S[2];
auto s2 = new S[2];
s1[0].label = "fish";
s1[1].label = "bar";
s2[0].label = "foo";
s2[1].label = "fish";
foreach(str; setIntersection(s1,s2))
writeln(str);
}
The code above generates this error:
C:\opt\dmd\windows\bin\..\..\src\phobos\std\functional.d(191):
Error: static assert "Bad binary function q{a < b}.
You need to use a valid D expression using symbols a of
type S and b of type S."
You did not define a way to compare two S structs. Try redefining S like
this:
struct S {
string label;
int opCmp(ref const S s2) const {
if(label < s2.label)
return -1;
if(label > s2.label)
return 1;
return 0;
}
}
So I attempted an intersection of string arrays, and received a
different error. I'm not sure if I am at fault or the compiler.
Shouldn't these work?
import std.algorithm;
import std.stdio;
import std.array;
struct S {
string label;
}
void main() {
auto s1 = ["fish", "bar"];
auto s2 = ["foo", "fish"];
foreach(str; setIntersection(s1,s2))
writeln(str);
}
Which ended up with:
test.d(13): Error: template std.algorithm.setIntersection(alias less
= "a < b",Rs...)
if (allSatisfy!(isInputRange,Rs)) does not match any function
template declaration
test.d(13): Error: template std.algorithm.setIntersection(alias less
= "a < b",Rs...)
if (allSatisfy!(isInputRange,Rs)) cannot deduce template
function from
argument types !()(immutable(char)[][2u],immutable(char)[][2u])
I think it's expecting dynamc arrays, not static ones. Auto is making
them static.
Try explicitly defining s1 and s2 as string[] or slice the literal, typing
them as dynamic arrays like this:
auto s1 = ["fish", "bar"][];
auto s2 = ["foo", "fish"][];
test.d(13): Error: foreach: int is not an aggregate type
This is a dummy error because it couldn't figure out the type of
setIntersection, so it just assumes int (a quirk of dmd).
-Steve