Pure virtual function in template
От: WebErr Россия  
Дата: 27.02.06 13:44
Оценка:
Как реализовать?
Можно ли оставить без реализации один из методов шаблона-предка, а после описать его в потомках?
Что-то наподобие:
template <typename T>
class base
{
    ...
    virtual void some();
};

template <typename T>
class sonA
{
    ...
    virtual void some();
};

template <typename T>
void sonA<T>::some()
{
    ...
}

template <typename T>
class sonB
{
    ...
    virtual void some();
};

template <typename T>
void sonB<T>::some()
{
    ...
}
C++ = C — 1;
Re: Pure virtual function in template
От: WebErr Россия  
Дата: 27.02.06 13:50
Оценка:
Здравствуйте, WebErr, Вы писали:

WE>Как реализовать?

WE>Можно ли оставить без реализации один из методов шаблона-предка, а после описать его в потомках?
WE>Что-то наподобие:
WE>
WE>template <typename T>
WE>class base
WE>{
WE>    ...
WE>    virtual void some();
WE>};

WE>template <typename T>
WE>class sonA
WE>{
WE>    ...
WE>    virtual void some();
WE>};

WE>template <typename T>
WE>void sonA<T>::some()
WE>{
WE>    ...
WE>}

WE>template <typename T>
WE>class sonB
WE>{
WE>    ...
WE>    virtual void some();
WE>};

WE>template <typename T>
WE>void sonB<T>::some()
WE>{
WE>    ...
WE>}
WE>


То есть у Son'ов имеется в виду public-наследование от класса base!!! Sorry!!!
C++ = C — 1;
Re: Pure virtual function in template
От: rg45 СССР  
Дата: 27.02.06 13:56
Оценка:
Здравствуйте, WebErr, Вы писали:

WE>Как реализовать?

WE>Можно ли оставить без реализации один из методов шаблона-предка, а после описать его в потомках?
WE>Что-то наподобие:
WE>
WE>template <typename T>
WE>class base
WE>{
WE>    ...
WE>    virtual void some();
WE>};

WE>template <typename T>
WE>class sonA
WE>{
WE>    ...
WE>    virtual void some();
WE>};

WE>template <typename T>
WE>void sonA<T>::some()
WE>{
WE>    ...
WE>}

WE>template <typename T>
WE>class sonB
WE>{
WE>    ...
WE>    virtual void some();
WE>};

WE>template <typename T>
WE>void sonB<T>::some()
WE>{
WE>    ...
WE>}
WE>


Хоть вопрос и задан достаточно сбивчиво, но, я надеюсь, я правильно его понял.


В базовом классе функцию some в этом случае следуе объявить как чисто виртуальную и оставить ее без реализации:


template <typename T>
class base
{
    virtual void some() = 0;
};
--
Справедливость выше закона. А человечность выше справедливости.
Re: Pure virtual function in template
От: Sm0ke Россия ksi
Дата: 28.02.06 11:15
Оценка:
Здравствуйте, WebErr, Вы писали:

WE>Как реализовать?

WE>Можно ли оставить без реализации один из методов шаблона-предка, а после описать его в потомках?

Тоесть:
template <class T> class Base
{
public:
  virtual bool fnTest() = 0;
};

template <class T> class Test : Base<T>
{
public:
  virtual bool fnTest();
};

template <class T> bool Test<T>::fnTest()
{
  return true;
}

или
template <class T> class Test
{
  void fnTest();
};

void Test<int>::fnTest() {}
void Test<float>::fnTest() {}
void Test<MyClass1>::fnTest() {}
Re[2]: Pure virtual function in template
От: WebErr Россия  
Дата: 01.03.06 14:48
Оценка:
Здравствуйте, Sm0ke:

А разве можно писать внутри шаблона то же, что и в обычном классе.
Мне некоторые компиляторы не дают написать = 0 после описания метода в шаблоне.
Как впрочем и параметры по умолчанию объявить мне не удаётся.

Вот поэтому я и спрашиваю, а в каких компиляторах прокатит такая фишка, что

template <typename T>
class some
{
    ...
    virtual void to_do() = 0;
};


А в каких выдаст ошибку компиляции на данной строке:
virtual void to_do() = 0;


Дело в том, что у меня нет возможности пользоваться MSVS.
C++ = C — 1;
Re[3]: Pure virtual function in template
От: Кодт Россия  
Дата: 02.03.06 01:37
Оценка:
Здравствуйте, WebErr, Вы писали:

WE>А разве можно писать внутри шаблона то же, что и в обычном классе.

WE>Мне некоторые компиляторы не дают написать = 0 после описания метода в шаблоне.
WE>Как впрочем и параметры по умолчанию объявить мне не удаётся.

Может быть, ты пытался написать шаблон функции?
template<class T>
class Foo
{
  template<class V>
  virtual void bar();
}

Так, разумеется, нельзя.

WE>Вот поэтому я и спрашиваю, а в каких компиляторах прокатит такая фишка,

WE>А в каких выдаст ошибку компиляции на данной строке:
WE>virtual void to_do() = 0;

WE>Дело в том, что у меня нет возможности пользоваться MSVS.

Проверь на том компиляторе, который есть у тебя. Кстати, на каком?
Уж не борланд билдер ли? Или к тебя зоопарк из компиляторов?
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.