0

我在为一个类编写专业化时遇到了一个问题(错误 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
}

其余专业也会出现该错误。

4

3 回答 3

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 中的模板函数不能被标记为虚拟的。

于 2012-08-12T20:31:22.050 回答
0

试试这个:

class QuickPrint : public Print {
    template<class T>
    void startPrint(void) { Print::startPrint<T>(); };
};
于 2012-08-12T20:35:07.740 回答
-1

你的问题是这一行:

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

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

删除该函数体,它应该可以工作。

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

于 2012-08-12T20:22:46.903 回答