1

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

次のコードはコンパイルされません。

#include <iostream>
#include <set>
using namespace std;

template<class T>
void printSet(set<T> s){
    set<T>::iterator it;
}

int main(int argc, char** argv){
    set<int> s;
    printSet<int>(s);
    return 0;
}

次のようなエラーが発生します。

set.cpp: In function ‘void printSet(std::set<T, std::less<_Key>, std::allocator<_CharT> >)’:
set.cpp:7: error: expected `;' before ‘it’
set.cpp: In function ‘void printSet(std::set<T, std::less<_Key>, std::allocator<_CharT> >) [with T = int]’:
set.cpp:12:   instantiated from here
set.cpp:7: error: dependent-name ‘std::set<T,std::less<_Key>,std::allocator<_CharT> >::iterator’ is parsed as a non-type, but instantiation yields a type
set.cpp:7: note: say ‘typename std::set<T,std::less<_Key>,std::allocator<_CharT> >::iterator’ if a type is meant

私は何を間違えましたか?私はほとんど何も書いたことがないような気がします、そしてすでにC++は私にこの恐ろしいメッセージを与えます。

役に立つ場合は、イテレータで行をコメントアウトしてもエラーはないようです。ただし、これまでオンラインで見たすべての例は、このようにイテレータを宣言しているようです。おもう。

4

1 に答える 1

10

したがって、宣言の前にキーワードtypenameを付けます。

typename set<T>::iterator it;

テンプレート引数に依存する型を参照するときはいつでも、これを行う必要があります。この場合、は T に依存しています。それ以外の場合、コンパイラは、それが型なのか、静的メンバーなのか、それ以外なのかを判断するのにiterator苦労します。iterator(技術的には、それを理解しようとはしません。その決定はすでに行われています。たまたま間違っているだけです)

たとえば、具象型がある場合は次のように注意してください。

set<int>::iterator it;

typename必要ありません。

于 2012-07-03T04:33:25.030 に答える