首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟模板解决方法

虚拟模板解决方法
EN

Stack Overflow用户
提问于 2011-06-10 20:24:41
回答 2查看 2.8K关注 0票数 1

我有一个派生自MyContainer的模板容器类。MyContainer定义了Get()Set()等方法来访问单个元素。我想创建一个实现为MyContainer<char>的位域类,其中每个char元素包含CHAR_BIT位数。但是,为了允许用户对单个位而不是整个字节进行操作,我必须将Get()Set()设为虚拟的,这是非法的。有哪些替代方案?

我正在考虑在派生类中定义GetBit()SetBit(),但这会违反利斯科夫替换原则。(考虑一下SortMyContainer()函数。)

编辑:下面是一个简化的例子:

代码语言:javascript
复制
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.
{
    // ...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-10 20:29:19

它不是非法的,只有模板虚拟成员函数是非法的。

代码语言:javascript
复制
// 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;
}

如果我弄错了,请考虑放置一个代码示例。

在添加示例代码后进行编辑:

代码语言:javascript
复制
template <typename Datatype>
virtual // <-- nope, not here
Datatype MyContainer<Datatype>::Get()
{
    // ...
}

virtual只是类主体内声明的一部分。这应该是有效的:

代码语言:javascript
复制
template <typename Datatype>
Datatype MyContainer<Datatype>::Get()
{
    // ...
}

但是,请注意,定义必须在模板实例化时可见。因此,要么把它也放在头文件中(或者放在一个额外的头文件中,然后把它包含在真正的头文件中),要么把它留在类主体中。

(现在请不要提及export__ed模板,你和我都知道它们很多,但它们还不是一个初学者的话题,在下一个标准中将被弃用)

票数 4
EN

Stack Overflow用户

发布于 2011-06-10 20:36:39

您似乎对模板的构成感到困惑。类模板可能有虚函数,实际上,这些模板参数可能出现在这些函数的签名中。

代码语言:javascript
复制
template<typename T> class an_interface {
    virtual T Get() = 0;
};
class a_class : public an_interface<int> {
};

这是完全正确的。不完全有效的是

代码语言:javascript
复制
class an_interface {
    template<typename T> virtual T Get() = 0;
}

除非有问题的特定成员函数有自己的独立模板参数,否则成员函数不是模板,可能是虚拟的,无论它是否从类模板生成。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6306317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档