无法解析模板功能的类型

时间:2014-06-23 15:40:22

标签: templates d phobos

我尝试在D中编写非常简单的代码,但我对其中一个标准库模板函数(特别是来自nextPermutation的{​​{1}}有一些问题)。

我试图做的关键是创建所有pandigital数字的排列(即包含所有值1到9的数字一次)。

为此,我完成了以下工作:

std.algorithm

这给了我错误:

  

错误:无法解析nextPermutation的类型!(初始)

我还试图明确设置类型:

import std.algorithm;
import std.conv;

int[] pandigitals()
{
    char[] initial = "123456789".dup;
    auto pan = [to!int(initial)];
    while(nextPermutation!(initial)) {
       pan ~= to!int(initial);
    }
    return pan;
}

但是,这会出错,说它与模板不匹配:

  

错误:模板实例std.algorithm.nextPermutation!(" a< b",char [])与模板声明nextPermutation不匹配(alias less =" a< b&#34 ;,BidirectionalRange)(ref BidirectionalRange range)if(isBidirectionalRange!BidirectionalRange&& hasSwappableElements!BidirectionalRange)

呼叫的正确形式是什么?

1 个答案:

答案 0 :(得分:5)

嗯,你的第一个问题是你将initial作为模板参数而不是函数参数传递。 !()用于模板参数。所以,而不是

while(nextPermutation!(initial))

你需要做

while(nextPermutation(initial)) {

现在,这仍然会给你一个错误。

q.d(10): Error: template std.algorithm.nextPermutation cannot deduce function from argument types !()(char[]), candidates are:
/usr/include/D/phobos/std/algorithm.d(12351):        std.algorithm.nextPermutation(alias less = "a<b", BidirectionalRange)(ref BidirectionalRange range) if (isBidirectionalRange!BidirectionalRange && hasSwappableElements!BidirectionalRange)

这是因为hasSwappableElements!(char[])false,而nextPermutations'模板约束,true类型需要nextPermutations才能使用false。< / p>

它是dchar因为所有字符串都被视为char的范围,而不是它们的实际元素类型。这是因为在UTF-8(wchar)和UTF-16(dchar)中,每个代码点有多个代码单元,因此对单个代码单元进行操作可能会破坏代码点,而在UTF-32(char),每个代码点总有一个代码单元。从本质上讲,如果wcharchar的数组被视为wchardchar的范围,您将面临分解字符的高风险,这样您就可以结束用字符而不是整个字符。因此,通常在D中,如果您要对单个字符进行操作,则应使用char,而不是wcharhasSwappableElements!(char[])。如果您对Unicode不是很熟悉,我建议您阅读Joel Spoelsky关于此主题的this article

但是,无论falsefalse的原因是什么, dchar[],因此您需要使用其他类型。最简单的方法可能就是将算法交换为使用int[] pandigitals() { dchar[] initial = "123456789"d.dup; auto pan = [to!int(initial)]; while(nextPermutation(initial)) { pan ~= to!int(initial); } return pan; } 代替。

{{1}}