2010-12-30 1 views
6

わかりました、私は私の問題の簡単な例を与えるつもりだ:テンプレートパラメータを別のテンプレートに渡すことができないのはなぜですか?

void Increment(Tuple<int, int>& tuple) { 
    ++tuple.Get<0>(); 
} 

int main() { 

    Tuple<int, int> tuple; 

    tuple.Get<0>() = 8; 

    Increment(tuple); 

    printf("%i\n", tuple.Get<0>()); // prints 9, as expected 

    return 0; 

} 

これはうまくコンパイルし、すべてが桃です。 Increment関数は、タプルの最初の要素をインクリメントし、その要素を出力します。しかし、私のIncrement関数をどのような要素でも使用できるのであればいいとは思いませんか?

template <typename T> 
void Increment(Tuple<T, T>& tuple) { 
    ++tuple.Get<0>(); // <-- compile ERROR 
} 

int main() { 

    Tuple<int, int> tuple; 

    tuple.Get<0>() = 8; 

    Increment<int>(tuple); 

    printf("%i\n", tuple.Get<0>()); 

    return 0; 

} 

私の第二の例は、コンパイル時に以下のエラーを吐く:

error: expected primary-expression before ')' token 

私は、これが問題を起こす理由を理解しようと、私の知恵の終わりです。テンプレートパラメータは 'int'なので、生成されたコードはと同じです。ハードコードされた例と同じです。これをどのように機能させることができますか?

+1

醜さとtrickinessはおそらくタプルが自由 'GET'機能持ちのstdとの両方後押しする理由です:' ++ <0>(タプル)を取得します。 ' – UncleBens

答えて

11

それは次のようになります。

++tuple.template Get<0>(); 

を使用すると、依存タイプから資格の種類を指定するtypenameを必要とするのと同じ方法では、依存の型から修飾テンプレート関数を指定するtemplateを必要としています。

+0

華麗に働いた!私はこれらの年月を経てC++を使用した後、私がそれを聞いたことがないと信じられません。テンプレートを頻繁に使用するのではないと思います。ありがとう! – nonoitall

+0

@nonoitall:何らかの理由であまり知られていません。 (多くの人々がNSVCを使用し、それがなくても動作するので、最初は問題に遭遇することはありません) – GManNickG

+0

@Gman:MSVCはそれを必要としないためです。 – Puppy

4

GMANはすでに正しいanswerを与えているので、あなたはまだIncrement(tuple)の代わりにIncrement<int>(tuple)(後者の構文は少し複雑に見える)と書くことができます。コンパイラは、ファンクションテンプレートタイプタイプからtupleまで推論するのに十分なインテリジェントです。

この参照:GManの答えに示すように、使用のhttp://www.ideone.com/juNOg

+0

コメントありがとうございました。私はそれが働かせるために様々なことをテストすることが彼からの保留だと思う。 – GManNickG

関連する問題