我有一个派生自MyContainer的模板容器类。MyContainer定义了Get()、Set()等方法来访问单个元素。我想创建一个实现为MyContainer<char>的位域类,其中每个char元素包含CHAR_BIT位数。但是,为了允许用户对单个位而不是整个字节进行操作,我必须将Get()和Set()设为虚拟的,这是非法的。有哪些替代方案?
我正在考虑在派生类中定义GetBit()和SetBit(),但这会违反利斯科夫替换原则。(考虑一下SortMyContainer()函数。)
编辑:下面是一个简化的例子:
template <typename Datatype>
struct MyContainer
{
virtual Datatype Get();
};
template <typename Datatype> // Error: Templates may not be virtual.
virtual Datatype MyContainer<Datatype>::Get() // EDIT: The problem was on this line. The "virtual" keyword should only appear with the function declaration.
{
// ...
}发布于 2011-06-10 20:29:19
它不是非法的,只有模板虚拟成员函数是非法的。
// valid
template<typename T> class MyContainer {
virtual void set(const T &) = 0;
}
// not valid
class MyContainer {
template <typename T> virtual void set (const T &) = 0;
}如果我弄错了,请考虑放置一个代码示例。
在添加示例代码后进行编辑:
template <typename Datatype>
virtual // <-- nope, not here
Datatype MyContainer<Datatype>::Get()
{
// ...
}virtual只是类主体内声明的一部分。这应该是有效的:
template <typename Datatype>
Datatype MyContainer<Datatype>::Get()
{
// ...
}但是,请注意,定义必须在模板实例化时可见。因此,要么把它也放在头文件中(或者放在一个额外的头文件中,然后把它包含在真正的头文件中),要么把它留在类主体中。
(现在请不要提及export__ed模板,你和我都知道它们很多,但它们还不是一个初学者的话题,在下一个标准中将被弃用)
发布于 2011-06-10 20:36:39
您似乎对模板的构成感到困惑。类模板可能有虚函数,实际上,这些模板参数可能出现在这些函数的签名中。
template<typename T> class an_interface {
virtual T Get() = 0;
};
class a_class : public an_interface<int> {
};这是完全正确的。不完全有效的是
class an_interface {
template<typename T> virtual T Get() = 0;
}除非有问题的特定成员函数有自己的独立模板参数,否则成员函数不是模板,可能是虚拟的,无论它是否从类模板生成。
https://stackoverflow.com/questions/6306317
复制相似问题