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特殊化を 1 つ追加します。

于 2012-08-12T20:22:46.903 に答える