Частичная специализация для указателей, c ++ - PullRequest
4 голосов
/ 22 января 2011

Как сделать частичную специализацию класса GList, чтобы можно было хранить указатели I (т.е. I *)?

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


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

Ответы [ 2 ]

7 голосов
/ 22 января 2011

Вам не нужно специализироваться, чтобы допустить это. Он может хранить указатели уже.

GList<int*> ints;

В любом случае, если вы хотите специализировать GList для указателей, используйте следующий синтаксис.

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

Тогда просто используйте I, как в обычном шаблоне. В приведенном выше примере с GList<int*> будет использована специализация указателя, а I будет int.

5 голосов
/ 22 января 2011

В предыдущем сообщении говорится, что вам НЕ НУЖНО специализироваться на типах указателей, но вы можете.

Примите во внимание следующее:

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();
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...