0

別のテンプレート クラスから継承する、部分的に特殊化されたテンプレート クラスを作成しようとしています。その方法がわかりません。これが私のコードです:

template < typename T>
struct SmallContainer
{
    typedef vector<T> type;
};

template<typename CONTAINER, typename T>
class AnotherClass : public CONTAINER<SmallContainer<T>::type>
{ // ..... };

そしてgccは、「<」の前に予想されるテンプレート名を言い続けます トークンは「<」の前に「{」が必要です '<' の前に unqualified-id が必要なトークン トークン

私のオブジェクトのアイデアは、AnotherClass を、必要な他の型のベクトルの汎用コンテナーにすることです。

template< template CONTAINER, typename T> などを実行しようとしましたが、成功しませんでした。何か案が ?ありがとう...

4

3 に答える 3

3

ユーザーにコンテナーを指定させる通常の方法は、コンテナー テンプレートだけでなく、実際のコンテナークラスをテンプレート パラメーターとして使用することです。これは、標準ライブラリがコンテナー アダプターを指定する方法でもあります。例えば:

template <typename T, typename Container = std::vector<T>>
class Foo
{
public:
    typedef Container container_type;

    void multiply_all()
    {
        using std::begin;
        using std::end;

        for (auto it(begin(c)), e(end(c)); it != e; ++it)
        {
            *it = *it + *it;
        }
    }

private:
    container_type c;
};

ユーザーは のような他のインスタンスを作成できるようFoo<int, CrazyContainer<int, true, Blue>> x;になり、コンテナーの詳細について心配する必要がなくなりました。

于 2012-05-18T20:41:07.330 に答える
2

これは、テンプレート引数が 1 つだけのコンテナーで機能します。

template< template< typename > class Container, typename T >
class AnotherClass
  : public Container< typename SmallContainer< T >::type >
{};

ただし、標準コンテナには追加のテンプレート引数 (アロケータなど) があるため、これは機能しません。

typenameそうしないと、コンパイラはそれが値を参照しているSmallContainer< T >::typeと想定します。

于 2012-05-18T18:30:00.463 に答える
0

とにかく、STLコンテナではそうではありません。すべてのコンテナに SmallContainer のようなラッパーを作成して、デフォルトの引数を提供できるようにすることもできますが、STL コンテナはほとんどの部分で共通の引数を共有しません。さらに、任意のタイプのサードパーティのテンプレートを照合する方法はありません。ただし、ラッパーまたは C++11 エイリアスを指定すると、CONTAINER をテンプレート テンプレート パラメーターに変えることができます。

標準ライブラリ コンテナ テンプレートはどれも単一のテンプレート パラメータを使用しないことに注意してください。通常は使用しないデフォルトがあり、通常は 1 つだけを指定しますが、これまでに提案された回答はいずれも標準ライブラリ テンプレートでは機能しません。

于 2012-05-18T18:31:53.203 に答える