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,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; } }; 但我得到了一个错误:模板可能不是“虚拟的”。 正确的方法是什么?(有吗?修改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,
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;
}
};