2016-05-31 9 views
1

is:Dlang静的テンプレート構造体/クラス関数

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

このエラーは実際には分かりません。私はこれがリテラルタグ@propertyの問題ではないと思っていた(そうではなかったようだが、@propertyの機能はどちらかというと理解していない)ので、メインで一緒にすべてテストするためにいくつかの構造体を作った。

Barが静的​​ addIDを使用し、fooが静的およびテンプレートの両方である一方、 Batzはテンプレート addIDを使用する以外
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); 
} 

これらの他のクラスは、実質的に同じです。

Fooは、エラーをスローする唯一の構造体であり、それによって私は困惑します。私はD Templateのチュートリアル(あなたが興味を持っているならば、近くの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関数の戻り値の型に適合します。

第2にどのようにFoo.addIDを呼び出していますか?私はFoo!(long)FooFoo!longの静的インスタンスです

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

のようにそれを呼び出すためにそれが正常に動作しますので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です。 –

関連する問題