0

そのため、課題用にテンプレート化された 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。つまり、クラスの定義があるので...

とにかく、これらのいくつかのことを明確にしてくれてありがとう!

4

1 に答える 1

1
template <typename T>
template <typename T2>
Vector<T>::Vector(const Vector<T2> &other)
{

のように書くことも有効です。

template <typename T> template <typename T2>
Vector<T>::Vector(const Vector<T2> &other)
{

必要なのは (?) 2 つのセットとして書き出すことだけです。これらはすべて 2 つのパラメーターのセットであるためです。1 つ目はクラス用、2 つ目は関数用です。

typename依存型および関連する規則 (thisテンプレート基本クラス メンバーおよびtemplateテンプレート メンバー関数(?) の場合) は、「2 フェーズ ルックアップ」と呼ばれるものと関係があります。ただし、これは MSVC++ での実装が (そうでない場合と同様に) 不適切であるため、準拠する実装ほど多くのエラーがスローされない可能性があります。

詳細 - http://blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html http://womble.decadent.org.uk/c++/template-faq.html#disambiguation http ://eli.thegreenplace.net/2012/02/06/dependent-name-lookup-for-c-templates/

于 2013-02-27T06:33:51.767 に答える