2

重複の可能性:
「template」および「typename」キーワードをどこに、なぜ配置する必要があるのですか?

テンプレート関数について学んでいます。ポインターのリストをクリアする静的テンプレート関数を実装しようとしています。それを行うには、テンプレートを使用したいと思います。その私のコード:

#include <cstdio>
#include <list>
using namespace std;

class util
{
public:
    template <class ARG>
    static void CleanPointers(list<ARG> &mylist) {
        list<ARG>::iterator it;
        for (it = mylist.begin(); it != mylist.end(); it++)
        {
            ARG obj = (ARG) *it;
            delete obj;
        }
        mylist.clear();
    };

    util();
    ~util();
};

int main()
{
    list<int*> mylist;
    mylist.push_back(new int(1));
    mylist.push_back(new int(2));
    util::CleanPointers<int*>(mylist);
    return 0;
}

次のコンパイルエラーメッセージを受け取りましたが、ここで何がポイントなのかわかりません。:)なぜ私が置く必要がある; その前に?

prog.cpp: In static member function ‘static void util::CleanPointers(std::list<ARG,         std::allocator<_Tp1> >&)’:
prog.cpp:10: error: expected `;' before ‘it’
prog.cpp:11: error: ‘it’ was not declared in this scope
prog.cpp: In static member function ‘static void util::CleanPointers(std::list<ARG,     std::allocator<_Tp1> >&) [with ARG = int*]’:
prog.cpp:28:   instantiated from here
prog.cpp:10: error: dependent-name ‘std::list::iterator’ is parsed as a non-type,   but instantiation yields a type
prog.cpp:10: note: say ‘typename std::list::iterator’ if a type is meant
4

4 に答える 4

2

したがって、タイプ名が必要です。

typename list<ARG>::iterator it;

ただし、コードの問題はこれだけではありません。削除する前に int にキャストするのはなぜですか? int へのポインターのコレクションではない場合、これは悪いバグです。この方法で削除する場合は、適切なポインター型を介して削除する必要があります。

さらに、ARG はポインター型でなければならないため、部分的な特殊化を入れることもできます。

テンプレートに関する C++ FAQ。それをすべて読むことをお勧めします。

キャストが悪である理由については FAQ も参照してください。

于 2012-09-13T14:31:56.307 に答える
1

従属名:

typename list<ARG>::iterator it;
于 2012-09-13T14:32:02.860 に答える
1

list<ARG>::iterator依存型です:

typename list<ARG>::iterator it;

「template」および「typename」キーワードをどこに、なぜ入力しなければならないのですか? を参照してください。

于 2012-09-13T14:32:52.570 に答える
0

あなたの主なエラーは、var'it'のタイプをどこかに定義することだと思います。コンパイラーは非型変数でforループを終了しようとするため、すべてのコンパイラー・エラーはエラー10の後でガベージになります。

于 2012-09-13T14:35:02.030 に答える