そのため、課題用にテンプレート化された Vector クラスを開発していて、グーグルで解決したいくつかの問題に遭遇しましたが、それでも自分がしていたことが間違っていた理由を知りたいです。最初の問題は、私が持っていたことです:
template <typename T>
class Vector
{
...
template <typename T2>
Vector(const Vector<T2> &other);
}
template <typename T, T2>
Vector<T>::Vector(const Vector<T2> &other)
{
...
}
これにより、VS11で「関数定義を既存の宣言と一致させることができません」というメッセージが表示されました。テンプレート定義を別の行に配置して修正しました。
template <typename T>
template <typename T2>
Vector<T>::Vector(const Vector<T2> &other)
{
...
}
しかし、なぜこれが必要だったのかはまだわかりません。最初の定義が複数のテンプレートを使用する関数/クラスに有効であることは知っていますが、テンプレート化されたクラスとテンプレート化されたメンバー関数を混在させると構文が変わるのはなぜですか?
2 番目の質問は、テンプレート クラス内の型に関するものです。イテレータを書くとき、私は次のような関数を持っていました:
template <typename T>
class Vector
{
...
class iterator
{
...
iterator &operator++(void);
}
}
template <typename T>
Vector<T>::iterator &Vector<T>::iterator::operator++(void)
{
...
}
これにより、「依存する名前はタイプではありません」と表示され、後で「タイプ名」を前に追加する必要があることがわかりました。
template <typename T>
typename Vector<T>::iterator &Vector<T>::iterator::operator++(void)
{
...
}
警告番号 (エラーになった) をグーグル検索した後、エラーが存在する理由がわかりましたが、コンパイラがそれが型であることを認識しない理由はあまり明白ではありませんVector<T>::iterator
。つまり、クラスの定義があるので...
とにかく、これらのいくつかのことを明確にしてくれてありがとう!