2016-05-31 120 views
1

我碰到,我是无法尝试使用模板的静态函数addID以下时,要解决一个错误:Dlang静态模板结构/类函数

module static_example; 

struct Foo(T: long) { 

    public static int addID(E)(E foo1, E foo2) { 
     return foo1.get() + foo2.get(); 
    } 

    private: 
     T ID; 

    alias T Type; 

    public this(T ID) { 
     this.ID = ID; 
    } 

    public T get() { 
     return this.ID; 
    } 
} 

我收到电话rdmd static_example.d错误是:

Error: template Foo(T : long) does not have property 'addID' 

我真的不明白这个错误。我认为这与字面标记@property(似乎不是,但我不明白@property函数)没有问题,所以我做了几个其他结构主要一起测试所有:

struct Bar { 

    public static int addID(Bar bar1, Bar bar2) { 
     return bar1.get() + bar2.get(); 
    } 

    private: 
     int ID; 

    public this(int ID) { 
     this.ID = ID; 
    } 

    public int get() { 
     return this.ID; 
    } 

} 

struct Batz(T: long){ 

    public int addID(E)(E foo) { 
     return this.get() + foo.get(); 
    } 

    private: 
     T ID; 

    alias T Type; 

    public this(T ID) { 
     this.ID = ID; 
    } 

    public T get() { 
     return this.ID; 
    } 
} 

void main() { 
    auto foo1 = Foo!int(27); 
    auto foo2 = Foo!int(13); 
    int staticTemplateAdd = Foo.addID(foo1, foo2); 

    auto bar1 = Bar(27); 
    auto bar2 = Bar(13); 
    int staticAdd = Bar.addID(bar1, bar2); 

    auto batz1 = Batz!int(27); 
    auto batz2 = Batz!int(13); 
    int templateAdd = batz1.addID(batz2); 
} 

这些其他类实际上是相同的,不同之处Bar使用静态addIDBatz使用模板addID而foo是静态和模板。

Foo是引发错误的唯一结构,并且我很难过。我正在关注一个D模板教程(如果您有兴趣,可以在顶部附近找到https://github.com/PhilippeSigaud/D-templates-tutorial/blob/master/D-templates-tutorial.md),但是它的例子对我来说都是外来的,并且似乎与我正在尝试做的有些不同。任何人都知道这里发生了什么?

+0

你打算怎么调用'addID'?请扩展您的问题。 – sigod

+0

@sigod main位于代码的底部。对不起,我可以让它更明显。 –

回答

1

都在你的Foo结构首先

public static int addID(E)(E foo1, E foo2) { 
    return foo1.get() + foo2.get(); 
} 

我建议返回自动?这样它将适合任何返回类型的传递模板类型的get函数。

其次你打电话给Foo.addID?因为它工作正常,我称它像

Foo!(long).addID!(Foo!long)(a, b); 

Foo!(long)FooFoo!long静态实例是通过类型addID

当我把它从一个非静态实例,它工作正常太。

auto foo = Foo!long(5); 
foo.addID!(Foo!long)(a, b); 
+1

所以问题是我调用静态函数而没有为Foo输入一个类型。现在我想到了,这是有道理的,因为没有什么可以推断出我要调用哪种类型的Foo类。我将我的静态调用从Foo.addID(foo1,foo2)更改为Foo!int.addID(foo1,foo2),并解决了问题。你的回答让我在那里,所以谢谢! –

+0

不客气:)很高兴你解决了它 – Bauss

+0

仅供参考,我不知道选择这样的答案的礼仪。因为你的帮助非常大,但它没有明确的答案。我将其标记为正确,但是如果应该编辑更直接地包含它,则为idk。 –