错误C2761成员函数重新声明不允许

时间:2012-08-12 20:16:37

标签: c++ templates specialization

我在为类编写特化时遇到了问题(错误C2761)。我的课程如下:

class Print{
public:
    typedef class fontA;
    typedef class fontB;
    typedef class fontC;
    typedef class fontD;

    template<class T>
    void startPrint(void) { return; };
    virtual bool isValidDoc(void) = 0;
};

我有一个继承QuickPrint类的类Print

class QuickPrint : public Print {
       ...
};

当我尝试为startPrint方法编写特化时发生错误:

template<>        // <= C2716 error given here
void QuickPrint::startPrint<fontA>(void)
{
      /// implementation
}

template<>        // <= C2716 error given here
void QuickPrint::startPrint<fontB>(void)
{
     /// implementation
}

其他专业化也会出现错误。

3 个答案:

答案 0 :(得分:1)

QuickPrint没有名为startPrint的模板成员函数,因此专门针对QuickPrint :: startPrint是一个错误。如果您在QuickPrint中重复模板定义,那么专业化是可以的:

class QuickPrint : public Print {
   template<class T>
    void startPrint(void) { return; };
 };

template<>        // <= C2716 error given here
void QuickPrint::startPrint<Print::fontA>(void)
{
      /// implementation
}

但如果此处的目标是能够以多态方式调用QuickPrint,那么您就会遇到麻烦,因为Print中的模板函数无法标记为虚拟。

答案 1 :(得分:0)

试试这个:

class QuickPrint : public Print {
    template<class T>
    void startPrint(void) { Print::startPrint<T>(); };
};

答案 2 :(得分:-1)

您的问题是这一行:

template<class T> 
void startPrint(void) { return; }; 

您已经提供了一个函数体,但是然后尝试再次重新定义它(使用专门化),这将无效。

删除该功能体,它应该可以工作。

要定义默认行为,请为模板参数T提供默认值,然后为该模板参数添加一个专门化。