テンプレートクラスでイテレータをtypedefするとエラーが出るのですが、

[戻る]
Arutu 2006/07/25(火) 16:21:51
いつもお世話になっております。

環境--
VisualC++ 2005
非MFC

以下のプログラムは投稿用にテストで作ったクラスですが、イテレータをtypedefしている部分でエ
ラーが大量発生し、原因がわからず困っています。

#include <list>

template<class T>
class CTest
{
    //! アイテムリスト
    typedef std::list<T> ItemList;
    //! アイテムイテレータ
    typedef std::list<T>::iterator ItemItr;
};

書き方がおかしいのでしょうか?

ちなみにテンプレートを使わず、
typedef std::list<int>::iterator ItemItr;
などとやると、コンパイルエラーは発生しません。

初歩的なことかもしれませんが、よろしくおねがいします。

επιστημη 2006/07/25(火) 16:43:42
×    typedef std::list<T>::iterator ItemItr;
○    typedef typename std::list<T>::iterator ItemItr;

Arutu 2006/07/25(火) 17:54:30
[[解決]]
無事にコンパイルが通りました。
ありがとうございました。

επιστημη 2006/07/25(火) 19:57:49
ひとつ注意。

> イテレータをtypedefしている部分でエラーが大量発生し、

どんなエラーが出たかきっちり書くべし。
答への糸口を出し惜しみして困るのはワタシ。それ以上に困るのはアナタ。

Arutu 2006/07/26(水) 10:52:34
[[解決]]
> どんなエラーが出たかきっちり書くべし。
そうですね、次からはそうしようと思います。

一応今回エラーの内容を書かなかった理由としては、
エラーの意味を理解するのが困難だったため、自分なりに説明して読み手が混乱するのを懸念してい
たのと、初歩的な構文ミスではないか?という推測があり、大量のエラーをコピペして読みずらくす
るのは気が引けたためです。

「必要ならばエラーの内容も追記します。よろしくおねがいします。」
などと書いておけばよかったですね。

いろいろ、ご迷惑おかけしました。

επιστημη 2006/07/26(水) 11:06:55
"大量のエラー"てのがわかりません。

> type foo.cpp
#include <list>

template<class T>
class CTest
{
    //! アイテムリスト
    typedef std::list<T> ItemList;
    //! アイテムイテレータ
    typedef std::list<T>::iterator ItemItr;
};

int main() {
  CTest<int> o;
}

> cl -c foo.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86 
Copyright (C) Microsoft Corporation.  All rights reserved.

foo.cpp
foo.cpp(9) : warning C4346: 'std::list<T>::iterator' : 依存名は型ではありません
。
        'typename' を持つプレフィックスは型を示します。
        foo.cpp(10) : コンパイルされたクラスの テンプレート のインスタンス
化 'CTest<T>' の参照を確認してください
foo.cpp(9) : error C2146: 構文エラー : ';' が、識別子 'ItemItr' の前に必要です。

foo.cpp(9) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は 
int を既定値としてサポートしていません

…こんだけやし。

Arutu 2006/07/26(水) 12:09:43
[[解決]]
おっしゃる通りです。
次からは気をつけます。

Arutu 2006/07/26(水) 12:11:08
お詫びの文章書くのをわすれてた^^;
いろいろ、ご迷惑おかけしました。

古いスレッドには追加発言できません。