[英]C++ templates declaration is not visible
我有以下代码:
#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'尚未声明为void write(WriteIterator&writeIterator,std :: size_t&len)覆盖
但是,如果我将定义IntField类更改为类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>
// ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.