gpt4 book ai didi

c++ - 为什么我需要重新声明部分模板特化的方法/成员?

转载 作者:行者123 更新时间:2023-11-30 02:29:15 28 4
gpt4 key购买 nike

我对 C++ 模板和尝试弄清楚部分模板特化还比较陌生。我正在使用模板实现几个相关的数据结构:用于概率存在/不存在查询的布隆过滤器(基于位数组),以及用于丰度查询的计数布隆过滤器(带有整数数组)。我从以下类定义开始。

template<typename ElementType, typename CounterType, size_t maxcount>
class filter
{
public:
explicit filter(std::vector<size_t> array_sizes);
void add(ElementType element);
CounterType get(ElementType element);

protected:
std::vector<std::vector<CounterType>> _arrays;
};

addget 的通用实现都是正确的,但是get 可以针对基于位数组的布隆过滤器进行优化。如果我只是尝试添加一个带有签名的方法...

template<typename ElementType>
bool filter<ElementType, bool, 1>::get(ElementType element);

...我从编译器收到以下错误消息。

error: nested name specifier 'filter<ElementType, bool, 1>::'
for declaration does not refer into a class, class template
or class template partial specialization

通过一些阅读,我了解到单个方法不能部分特化,除非整个类都是部分特化的。无论如何,这实际上很方便,因为这让我有机会为(部分)专业类提供新标签。我将其添加到页眉底部...

template<typename ElementType> class bloomfilter : public filter<ElementType, bool, 1> {};
template<typename ElementType> class countfilter : public filter<ElementType, uint8_t, 255> {};
template<typename ElementType> class bigcountfilter : public filter<ElementType, uint32_t, 8589934591> {};

...并将方法签名从...更改

template<typename ElementType>
bool filter<ElementType, bool, 1>::get(ElementType element);

...到...

template<typename ElementType>
bool bloomfilter<ElementType>::get(ElementType element);

显然这还不够。我需要在部分专用类定义中显式定义 bloomfilter::get 方法。

template<typename ElementType>
class bloomfilter : public filter<ElementType, bool, 1>
{
public:
bool get(ElementType element);
};

但是现在编译器提示 _arrays 是一个未声明的标识符。直到我添加它才能正确编译。

template<typename ElementType>
class bloomfilter : public filter<ElementType, bool, 1>
{
public:
bool get(ElementType element);

protected:
std::vector<std::vector<bool>> _arrays;
};

为什么我必须在部分特化的模板类中显式定义 get_arrays?为什么它们不从泛型类继承?

最佳答案

很确定您的问题是您需要使用 this 来限定名称 _arrays。尝试将 _arrays 的所有实例更改为 this->_arrays

在 C++ 中,为了访问模板基类的成员,您必须进一步限定名称以阐明名称是否依赖于基类的模板参数(我认为)。如果您对此功能的更多技术细节感兴趣(比我解释得更好),请查看 here .

关于c++ - 为什么我需要重新声明部分模板特化的方法/成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39758687/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com