首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++模板声明不可见

C++模板声明不可见
EN

Stack Overflow用户
提问于 2019-05-15 03:17:36
回答 1查看 121关注 0票数 6

我有以下代码:

代码语言:javascript
复制
#include <cstddef>
#include <cstdint>

using ReadIteratorType = Buffer::iterator;
using WriteIteratorType = Buffer::iterator;

template <typename TReadIterator, typename TWriteIterator>
class FieldBase
{
public:
    using ReadIterator = TReadIterator;
    using WriteIterator = TWriteIterator;

    virtual void read(ReadIterator& readIterator, std::size_t& len) = 0;
    virtual void write(WriteIterator& writeIterator, std::size_t& len) = 0;
};

template <typename TValue>
class Field : public FieldBase<ReadIteratorType, WriteIteratorType>
{
public:
    using ValueType = TValue;

    virtual const ValueType& getValue() const { return m_value; };
    virtual void setValue(const ValueType& value) { m_value = value;}
    constexpr std::size_t length() { return sizeof(TValue); }

protected:
    ValueType m_value {};
};

template <typename T>
class IntField : public Field<T>
{
public:

    void read(ReadIterator& readIterator, std::size_t& len) override
    {

    }

    void write(WriteIterator& writeIterator, std::size_t& len) override
    {

    }
};

每当我试图编译这段特定的代码时,我都会遇到

错误:‘readIterator’尚未声明为void read(ReadIterator& readIterator,std::size_t& len)重写

错误:‘writeIterator’尚未声明为无效写入(writeIterator& writeIterator,std::size_t& len)重写

但是,如果我将定义IntField类更改为类IntField : public Field或任何具有特定类型的类,它都会正确编译。为什么IntField不能在当前上下文中作为模板?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-15 03:21:18

这是一个众所周知的问题。编译器不知道ReadIterator需要来自模板化的基类,因为它试图在模板实例化的第一步中解析名称。您可以在此处找到有关两阶段名称查找的更多信息:http://blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html

您需要在此详细说明:

代码语言:javascript
复制
void read(typename Field<T>::ReadIterator& readIterator, std::size_t& len) override

或者,为了省去一些输入:

代码语言:javascript
复制
using base_t = Field<T>;
void read(typename base_t::ReadIterator& readIterator, std::size_t& len) override

顺便说一句,你的代码对我来说没有多大意义。我希望你的IntField to 而不是成为一个模板:

代码语言:javascript
复制
class IntField : public Field<int>
// ...
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56137179

复制
相关文章

相似问题

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