模板功能的特化可以是虚拟的吗?

时间:2011-10-02 18:07:43

标签: c++ visual-studio-2010

例如,

之类的东西
class A {
    template<typename T> T DoStuff();
    template<> virtual int DoStuff<int>() = 0;
};

Visual Studio 2010说不,但我觉得很简单,我只是搞砸了语法。成员函数模板的显式完全特化是否可以是虚拟的?

3 个答案:

答案 0 :(得分:8)

明确的专业化在一个类中是不合法的。即使你可以使它成为部分专业化,你仍然会遇到“模板不能虚拟”的问题。

n3290,§14.5.2陈述:

  

成员函数模板不应是虚拟的。

并给出了这个例子:

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

在继续说明成员函数模板也不计入虚拟覆盖之前。

答案 1 :(得分:2)

根据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
};

答案 2 :(得分:0)

通过使用常规的非模板虚函数重载函数模板,可以获得类似的效果。