Могут ли специализации шаблонной функции быть виртуальными? - PullRequest
5 голосов
/ 02 октября 2011

Что-то вроде, например,

class A {
    template<typename T> T DoStuff();
    template<> virtual int DoStuff<int>() = 0;
};

Visual Studio 2010 говорит «нет», но у меня возникает странное ощущение, что я просто испортил синтаксис.Могут ли явные полные специализации шаблона функции-члена быть виртуальными?

Ответы [ 3 ]

8 голосов
/ 02 октября 2011

Явные специализации недопустимы в классе. Даже если бы вы могли сделать это частичной специализацией, вы все равно столкнулись бы с проблемой «шаблоны не могут быть виртуальными».

n3290, § 14.5.2 состояния:

Шаблон функции-члена не должен быть виртуальным.

И приводит этот пример:

template <class T> struct AA {
  template <class C> virtual void g(C); // error
  virtual void f(); // OK
};

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

2 голосов
/ 02 октября 2011

Согласно стандарту C ++ 98 шаблон функции-члена не должен быть виртуальным. http://www.kuzbass.ru:8086/docs/isocpp/template.html.

-3- Шаблон функции-члена не должен быть виртуальным. [Пример:

template <class T> struct AA {
  template <class C> virtual void g(C);   //  error
  virtual void f();                       //  OK
};
0 голосов
/ 02 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...