использование шаблонных классов в качестве параметров метода - PullRequest
1 голос
/ 16 ноября 2010

У меня есть два класса шаблонов: Class1 и Class2 . В Class2 есть метод, который имеет в качестве параметра указатель на объект Class1 . Должен ли я затем переопределить class2 для class2 ? или есть другое лучшее решение? Проблема в том, что у меня могут быть новые методы, ссылающиеся на объекты других шаблонных классов в качестве параметров. Поэтому я бы не хотел, чтобы как: class2

template < class S >
class Class1{
    public:
        ...
    private:
        ...
};

template < class T >
class Class2{
    public:
        ...
        Class2<T> * doSomething(Class1<S> * );
        ...
    private:
        ...
};

template < class S, class T >
class Class2{
    public:
        ...
        Class2<T> * doSomething(Class1<S> * );
        ...
    private:
        ...
};

1 Ответ

5 голосов
/ 16 ноября 2010

Тип объекта, на который действует Class2::doSomething, не должен быть частью типа Class2.Так что сделайте Class2::doSomething() a Шаблон функции-члена :

template < class T >
class Class2{
    public:
        ...
        template<class S> Class2<T> * doSomething(Class1<S> * );
        ...
    private:
        ...
};

РЕДАКТИРОВАТЬ:

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

template<class FooType> class Foo
{
};

template<class BarType> class Bar
{
public:
    template<class FooType> Bar<BarType>* doSomething(Foo<FooType>* foo);
};

template<typename BarType> template<typename FooType> Bar<BarType>* Bar<BarType>::doSomething(Foo<FooType>* foo)
{
    return 0;
}

int main()
{
    Foo<unsigned> foo_1;
    Bar<double> bar_1;
    Bar<double> * bar_copy = 0;
    bar_copy = bar_1.doSomething<unsigned>(&foo_1);
    return 0;
}
...