C ++のtypedefとテンプレート

小さなクラスがあるとします

template
class c {
    template
    class Test {
    public:
        typedef std::vector vetor_type;

        vetor_type some_var;
    };

    void f() {
        Test::vetor_type tt; //error
    }
};

私はエラーが発生します:

予想される ';'式の後。

編集:なぜ私はtypenameについての答えが削除されたのか分からない、実際に助けた原因。 しかし、別のクラステンプレートの中にこのコードを書いていると、なぜ誰かがtypenameを使わなければならないのか説明できますか?

2
Test :: this_type Test とまったく同じですが、
追加された 著者 Kerrek SB,
編集した後でさえ、元のクラスは本質的に class Box {Box x; };
追加された 著者 Kerrek SB,
@ケレックSB - 私の例を変更しました
追加された 著者 givi,
私はApple LLVMコンパイラ3.0を使っていますが、gcc 4.2でも試してみました。
追加された 著者 givi,
@kol申し訳ありませんが、私の間違いです。私は別のクラステンプレートの中でそれをテストしました。そしてそこに私は誤りを得る。私はそれが無関係だと思った。
追加された 著者 givi,
@kolしかし、なぜクラステンプレートの中で使用する必要がありますか?
追加された 著者 givi,
@ケレックSB - 私はこのクラスは非常に合成されていないとあなたに同意します。しかし、実際には、テンプレートクラス内でstd :: vector iteratorを使用しようとしたときに会った問題を示しています。
追加された 著者 givi,
問題を示す完全な例を提供してください。示されているコードはうまくコンパイルされます。
追加された 著者 n.m.,
-1完全に違う!あなたのtypedefはTest内のTest でした。これは今ではベクトルです!
追加された 著者 kol,
大丈夫、問題無いです。 -1を削除しました。
追加された 著者 kol,
@yi_Hええ、 typename で、私にとってはうまくいきます。
追加された 著者 kol,
Test :: vetor_type が型であることをコンパイラに明示的に伝える必要があります。 Stroustrupの本、付録C、13.5節を参照してください。
追加された 著者 kol,
@giviこれはあなたが編集したので完全に動作します。何が問題なのですか?
追加された 著者 Seth Carnegie,
これはMSVC2010とGCC 4.1.2で正常にコンパイルされます。
追加された 著者 Oliver Charlesworth,
これで、投稿と削除の回答がうまくいきます。 typename
追加された 著者 Karoly Horvath,
ここに間違いはありません。エラーの前にコードを表示してください。
追加された 著者 prazuber,

2 答え

Test is dependent on the type used to instantiate c with so you need to use typename in the definition within foo().

void f() {
    typename Test::vetor_type tt;
}
5
追加された

..それはコードが私によく見えるので。

可能性のあるタイプミスがあります。多分 vetor_type はある場所にあり、 vector_type は別の場所にありますか?

0
追加された