gpt4 book ai didi

C++ 模板声明不可见

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:41 24 4
gpt4 key购买 nike

我有以下代码:

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

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