簡體   English   中英

C ++模板聲明不可見

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM