gpt4 book ai didi

templates - DMD 拒绝实例化模板 : not a template declaration

转载 作者:行者123 更新时间:2023-12-02 10:44:19 32 4
gpt4 key购买 nike

我在 D 中有一个模板类,它以另一个模板作为参数,它是这样开始的:

class RuleVars(alias RuleType, RuleRange, SubstitutionRange)
if (__traits(isTemplate, RuleType)) {

import std.range.primitives;
import std.traits;

import Capsicum.PatternMatching.Engine;

private {
static if (isAssociativeArray!RuleRange) {
alias RuleType = ElementType!(typeof(ruleRange.values));
} else {
alias RuleType = ElementType!RuleRange;
}

static if (isAssociativeArray!SubstitutionRange) {
alias SubstitutionType = ElementType!(typeof(ruleRange.values));
} else {
alias RuleType = ElementType!RuleRange;
}

alias MatchingPolicy = RuleType!(Element, RuleElement);
...

需要注意的重要一点是,如果 RuleType 不是模板,则该类将无法实例化。
作为必要,我有一个创建此类实例的函数:
RuleVars!(RuleType, RuleRange, SubstitutionRange) CreateRuleVars(alias  RuleType, RuleRange, SubstitutionRange)(RuleRange leftHandSide, SubstitutionRange rightHandSide) {
return new RuleVars!(RuleType, RuleRange, SubstitutionRange)(leftHandSide, rightHandSide);
}

但是,当我尝试像这样实例化类时:
CreateRuleVars!UnboundRules([0 : 'a', 2 : 'b', 4 : 'a', 6 : 'b'],
[1 :'a', 3 : 'a', 4 : 'b', 6 : 'b'])

我收到以下错误:
source\Capsicum\PatternMatching\RuleSet.d(25,26): Error: template instance RuleType!(Element, RuleElement) RuleType is not a template declaration, it is a alias
source\Capsicum\PatternMatching\RuleSet.d(73,1): Error: template instance Capsicum.PatternMatching.RuleSet.RuleVars!(UnboundRules, char[int], char[int]) error instantiating
source\Capsicum\PatternMatching\RuleSet.d(127,31): instantiated from here: CreateRuleVars!(UnboundRules, char[int], char[int])

它提示这条特定的行:
    alias MatchingPolicy = RuleType!(Element, RuleElement);

此处传递的特定模板在自己使用和实例化时被证明可以工作,因此应该没有问题。明明也是模板,否则模板参数匹配会失败。官方 D 文章显示模板可以像这样作为模板参数传递:
class Foo(T, alias C)
{
C!(T) x;
}

据我所见,我做得对。有任何想法吗?

最佳答案

问题是这些行:

alias RuleType = ElementType!(typeof(ruleRange.values));

你重新定义了一个本地符号 RuleType它隐藏了参数,因此后续行引用该本地别名而不是您要使用的参数。

现在,有趣的是,这可能是编译器中的一个诊断错误。如果您使用常规参数做了类似的事情:
    void main(string[] args) {
int args;
}

编译器会标记它:
Error: variable args is shadowing variable aa.sub.main.args

因为这几乎可以肯定是一个错误;您肯定打算使用两个单独的名称,因此您仍然可以引用参数(否则您只能引用局部变量!)。但似乎编译器没有对模板参数执行这样的测试。

关于templates - DMD 拒绝实例化模板 : not a template declaration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48815199/

32 4 0