Тот же класс с 2 или 1 параметром шаблона - PullRequest
2 голосов
/ 27 мая 2009

Как сделать шаблонную специализацию, которая принимает 2 параметра по сравнению с нормальным 1? Я строил класс указателя, и теперь я думал о расширении для создания массива, но если я попробую что-то вроде этого:

template<class T,int s> class pointer{};
template<class T> class pointer{};

class mama{};
int main(){
    pointer<mama> m;
}

Это дает мне ошибку. Шаблон ... объявлен заново с 1 параметром.

Мне нужно, чтобы он специализировался, потому что pointer<mama,10> имеет размер () и оператор [], а pointer<mama> - операторы-> и *.

Ответы [ 3 ]

8 голосов
/ 27 мая 2009

Вы можете создать общий шаблон для массива:

template <class TElem, int size = 0>
class pointer
{
    // stuff to represent an array pointer
};

Тогда частичная специализация:

template <class TElem>
class pointer<TElem, 0>
{
    // completely different stuff for a non-array pointer
};

Определив специализированную версию для случая, когда size = 0, вы можете фактически дать ей совершенно другую реализацию, но с тем же именем.

Однако, может быть, будет понятнее просто дать ему другое имя.

3 голосов
/ 27 мая 2009

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

template<class T,int s=10> class pointer{};

class mama{};
int main(){
    pointer<mama> m;
}

Мне нужно, чтобы он специализировался, потому что у указателя есть size () и оператор [], а у указателя нет, у него есть operator-> и *.

Похоже, вам нужен другой дизайн для вашего класса. Я не уверен, что специализация шаблона - это путь. Судя по вашей проблеме, вы действительно должны подумать о специализации на основе черт.

2 голосов
/ 27 мая 2009

Вы можете иметь значение по умолчанию для второго параметра, возможно, что-то вроде этого:

template <class T, int N=0>
class moo {
        T *foo;
public:
        moo() {
                if (N > 0) {
                        foo = new T[N];
                }
                else
                {
                        foo = new T;
                }
        }
};
...