1

オブジェクトの明示的な特殊化の書き方

Car<T>

仮想メソッドで clear()?

template <class U>
class List
{
   public:
        virtual void clear();

};


template <class T>
template <>
void List < Car <T> >::clear()   //Specialization U = Car <T>, compiler error
{
    ....
}

クラスカー:

template <class T>
class Car
{
   T speed;
   ...
}

コンパイル エラー:

エラー 16 エラー C3855: 'List': テンプレート パラメーター 'Car' は宣言 h:...\List.hpp と互換性がありません 75 エラー 20 エラー C2264: 'List::clear': 関数の定義または宣言にエラーがあります。関数が呼び出されていません h:...\List.hpp 75

しかし、この構造は大丈夫です

template <>
void List < Car <double> >::clear()   //Specialization U = Car <T>, compiler error
{
    ....
}
4

2 に答える 2

2

これを行う唯一の方法は次のとおりだと思います。

template<class T>
class Car
{
};

template <class U>
class List
{
   public:
        virtual void clear();

};

template <class T>
class List<Car<T> >
{
    public:
        virtual void clear() { /* specialization */ }
};

または、非インライン バージョン:

template <class T>
class List<Car<T> >
{
    public:
        virtual void clear();
};

template <class T>
void List<Car<T> >::clear() {
   /* specialization */ 
}

List<T>テンプレートタイプがまだ表示されている場合、実際には特化していませんが、部分的に特化しているためです。とにかく、私の推論は間違っている可能性があります。

于 2011-01-21T13:58:33.563 に答える
0

このよくある質問の項目を読んでください。

したがって、次のようになります。

struct Car
{
};

template <>
void List < Car >::clear()   //Specialization U = Car <T>, compiler error
{
    ....
}
于 2011-01-21T13:54:36.067 に答える