2011-01-21 13 views
4

Iのポインタ(つまりI *)を格納できるように、クラスGListの部分的な特殊化を行う方法?ポインタの部分的な特殊化

template <class I> 
struct TIList 
{ 
    typedef std::vector <I> Type; 
}; 


template <class I> 
class GList 
{ 
     private: 
      typename TIList <I>::Type objects; 
}; 

答えて

7

これを許可するために特化する必要はありません。既にポインタを格納することができます。

GList<int*> ints; 

とにかく、GListにポインターを特殊化する場合は、次の構文を使用します。

template <class I> 
class GList<I*> 
{ 
    ... 
}; 

通常のテンプレートと同じようにIを使用してください。上記の例では、GList<int*>で、ポインタの特殊化が使用され、Iintになります。

+0

と専門クラスのGList は、プライベートデータメンバオブジェクトの独自の実装を持っている必要がありますか? – Woody

+0

はい、スペシャライゼーションは元の基本テンプレートと何も共有しません。すべてのメンバ変数とメンバ関数をもう一度書く必要があります(または、可能であればそれらを共通の基底クラスに分解する)。 –

+0

私は、ポンターを処理するメソッドの中に別のコードが必要です。私はポインタのためのメソッドだけを専門にしようとしました:void GList メソッド(){...}とvoid GList メソッド{...}。しかし、コンパイラはそれらの違いを認識しません.... – Woody

5

前の記事では、ポインタタイプを特化する必要はありませんが、そうかもしれないと述べています。

は、次のことを考えてみましょう:

struct Bar { 
    void bar(void) { /* do work */ } 
}; 

template <class T> struct Foo { 
    T t; 

    void foo(void) 
    { 
     t.bar(); // If T is a pointer, we should have used operator -> right? 
    } 
}; 

int main(int argc, char * argv[]) 
{ 
    Foo<Bar *> t; 

    t.foo(); 
} 

これはコンパイルされません。 Foo :: fooではポインタがあるので、変数として使用します。

次を追加した場合、それは専門を使用し、罰金コンパイルします:

// This is a pointer to T specialization! 
template <class T> class Foo<T *> { 
    T * t; 
public: 
    void foo(void) 
    { 
     t->bar(); 
    } 
}; 
+0

それは本当に、本当に悪い考えです。特殊化のセマンティクスを決して変更しないでください。そうすると、 'std :: vector 'のようなものになります。 'std :: shared_pointer 'で 'Foo'を使うとどうなりますか?それは参照セマンティクスを使用するつもりはないので、すべての考えられるスマートポインタにも特化するつもりですか? –

+0

これは(本当に本当に)悪い考えであると思うので投票が遅くなりますか?これは特殊化が必要な場合の有効なケースです。あなたが話しているのは設計上の問題です。 – MatiasFG

関連する問題