C++ 错误:模板可能不是';虚拟';

C++ 错误:模板可能不是';虚拟';,c++,C++,我希望能够为基类mcformatter提供一个适用于不同类型(uint32、uint8…)的格式化方法 类MCFormatter{ 公众: mcformatter(){} 虚拟~mcformatter(){} 虚拟mcc_t Gen(); 受保护的: 模板//问题出在这里 虚空格式(K&a,常数K&b)=0; //... uint32_t a; uint8_t b; void Foo(); }; void mcformatter::Foo(){ 格式(a,3);//我希望能够调用格式 格式(b,

我希望能够为基类mcformatter提供一个适用于不同类型(uint32、uint8…)的格式化方法

类MCFormatter{ 公众: mcformatter(){} 虚拟~mcformatter(){} 虚拟mcc_t Gen(); 受保护的: 模板//问题出在这里 虚空格式(K&a,常数K&b)=0; //... uint32_t a; uint8_t b; void Foo(); }; void mcformatter::Foo(){ 格式(a,3);//我希望能够调用格式 格式(b,3);//带有uint32\u t和uint8\u t等 } G类格式:公共MCFormatter{ gformatter(){} 模板 虚空格式(K&a、常数K&b){ a=b; } }; 类eFormatter:公共MCFormatter{ eFormat(){} 模板 虚空格式(K&a、常数K&b){ a |=b; } }; 但我得到了一个错误:模板可能不是“虚拟的”。 正确的方法是什么?(有吗?

修改

class MCFormater {
    public:
    MCFormater() {}
    virtual ~MCFormater() {}
    virtual mcc_t Gen();
protected:
    template<typename K>                          //here is the problem
    virtual void Format(K& a, const K& b) = 0; 
    //...
    uint32_t a;
    uint8_t b;
    void Foo();
};

void MCFormater::Foo() {
   Format<uint32_t>(a, 3);
   Format<uint8_t>(b, 3);
}


class GFormater : public MCFormater {
    GFormater() {}
    template<typename K>
    virtual void Format(K& a, const K& b) {
        a = b;
    }
};

class EFormater : public MCFormater {
    EFormater(FTEKeeps* keeps) : MCFormater(keeps) {} 
    template<typename K>
    virtual void Format(K& a, const K& b) {
        a |= b;
    }
};
类MCFormatter{ 公众: mcformatter(){} 虚拟~mcformatter(){} 虚拟mcc_t Gen(); 受保护的: 模板//问题出在这里 虚空格式(K&a,常数K&b)=0; //... uint32_t a; uint8_t b; void Foo(); }; void mcformatter::Foo(){ 格式(a,3); 格式(b,3); } G类格式:公共MCFormatter{ gformatter(){} 模板 虚空格式(K&a、常数K&b){ a=b; } }; 类eFormatter:公共MCFormatter{ eFormatter(FTEKeeps*keeps):mcFormatter(keeps){} 模板 虚空格式(K&a、常数K&b){ a |=b; } }; 到

#包括
使用名称空间std;
模板
类格式化程序{
公众:
mcformatter(){}
虚拟~mcformatter(){}
虚拟mcc_t Gen();
受保护的:
虚空格式(K&a,常数K&b)=0;
//...
uint32_t a;
uint8_t b;
void Foo();
};
模板
void mcformatter::Foo(){
格式(a,3);
格式(b,3);
}
模板
G类格式:公共MCFormatter{
gformatter(){}
虚空格式(K&a、常数K&b){
a=b;
}
};
模板
类eFormatter:公共MCFormatter{
eFormatter(FTEKeeps*keeps):mcFormatter(keeps){}
虚空格式(K&a、常数K&b){
a |=b;
}
};

说明:成员函数模板不能是虚拟的。如果允许这样做,那么每次使用不同类型调用Format函数时,链接器都必须向虚拟表添加一个新条目。动态链接将变得异常复杂。

我无法从基类外部强制类型K,因为K在基类内部不同“成员函数不能是虚拟的”,模板属于该句开头。值得注意的是,模板类成员可以是虚拟的,但不能是模板成员函数(您的代码显示了这一点,但在解释中没有提到)。@Todder那么您就有了设计问题。您不能有虚拟模板成员函数。如果必须,请提供重载或非成员模板函数,该函数接受对象作为其参数之一。您不能解释所做的更改吗?在思想上区分这堵代码墙并不容易。我不认为代码的前后版本之间的差异很难看出。如果提出问题的人希望我进一步解释,我很乐意。
class MCFormater {
    public:
    MCFormater() {}
    virtual ~MCFormater() {}
    virtual mcc_t Gen();
protected:
    template<typename K>                          //here is the problem
    virtual void Format(K& a, const K& b) = 0; 
    //...
    uint32_t a;
    uint8_t b;
    void Foo();
};

void MCFormater::Foo() {
   Format<uint32_t>(a, 3);
   Format<uint8_t>(b, 3);
}


class GFormater : public MCFormater {
    GFormater() {}
    template<typename K>
    virtual void Format(K& a, const K& b) {
        a = b;
    }
};

class EFormater : public MCFormater {
    EFormater(FTEKeeps* keeps) : MCFormater(keeps) {} 
    template<typename K>
    virtual void Format(K& a, const K& b) {
        a |= b;
    }
};
#include<iostream>

using namespace std;

template<typename K>
class MCFormater {
public:
    MCFormater() {}
    virtual ~MCFormater() {}
    virtual mcc_t Gen();
protected:  
    virtual void Format(K& a, const K& b) = 0;
    //...
    uint32_t a;
    uint8_t b;
    void Foo();
};

template<typename K>
void MCFormater<K>::Foo() {
    Format<uint32_t>(a, 3);
    Format<uint8_t>(b, 3);
}

template<typename K>
class GFormater : public MCFormater<K> {
    GFormater() {}  
    virtual void Format(K& a, const K& b) {
        a = b;
    }
};

template<typename K>
class EFormater : public MCFormater<K> {
    EFormater(FTEKeeps* keeps) : MCFormater<K>(keeps) {}    
    virtual void Format(K& a, const K& b) {
        a |= b;
    }
};