0

重複の可能性:
なぜvではなくg++でtypedeftypenameを使用する必要があるのですか?

テンプレートクラスを次のように定義しています

template <class T>
class MyVector : public std::vector<boost::shared_ptr<T>>
{
public:
   typedef MyVector::iterator MyIter;
};

typedefでこのエラーが発生しますMyIter

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

VS 2010を使用してコンパイルしていますが、インクルードvectorboost::shared_ptrが存在することを確認しました。テンプレートを削除して、すべてのものTに置き換えると、intエラーなしでコンパイルされます。

私は何が欠けていますか?テンプレートクラスを定義し、イテレータをtypedefしたいと思います。

4

1 に答える 1

4

この質問はここで非常によく答えられます: なぜvではなくg++でtypedeftypenameを使用する必要があるのですか?

しかし、簡単に言うと、キーワードtypenameは次のように使用する必要があります。

typedef typename MyVector::iterator MyIter;

最初のパス(テンプレート構文の検証)では、コンパイラはMyVector :: iteratorが型であるか変数であるか(特殊なテンプレートで実際に何になるか)を実際には認識しないためです。したがって、それがタイプであることをほのめかすと、問題が修正されます。

于 2012-11-06T19:50:42.080 に答える