C++ 模板声明不可见

标签 c++ templates

我有以下代码:

#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
    {

    }
};

每当我尝试编译这个特定的代码时,我都会有 t

error: ‘ReadIterator’ has not been declared void read(ReadIterator& readIterator, std::size_t& len) override

error: ‘WriteIterator’ has not been declared void write(WriteIterator& writeIterator, std::size_t& len) override

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

最佳答案

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

这里你需要详细一点:

void read(typename Field<T>::ReadIterator& readIterator, std::size_t& len) override

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

using base_t = Field<T>;
void read(typename base_t::ReadIterator& readIterator, std::size_t& len) override

附带说明一下,您的代码对我来说意义不大。我希望您的 IntField 不是是一个模板:

class IntField : public Field<int>
// ...

关于C++ 模板声明不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56137179/

相关文章:

c++ - 什么是更快的阅读,ASCII 或二进制?

c++ - Windows 堆管理器 - 前端和后端分配器

C++ Tokenizer 复杂性与 strtok_r

c++ - 为什么模板参数推导在这里不起作用?

c++ - 编译器提示模板参数的数量错误,即使它在 boost 库文件中是正确的

c++ - 允许 GCC 特定的 undefined reference

c++ - 释放DLL之前是否已完成卸载DLL?

python - 突出显示主动导航 : django 1. 4.2

c++ - C++ 中的原始数组与数组模板

python - 如何在模板的 url 函数上使用 urlize 过滤器?