explicitly specify type arguments because gcc is dumb