C++中模板方法的返回类型

时间:2021-01-28 16:39:00

标签: c++ templates debugging syntax syntax-error

我有这两个 header 文件,List.hListTraits.h List.h 继承自 ListTraits.h,本意是模板类实现

std::list。现在一切正常,但 insert() 方法实现。 我必须在 ListTraits.h 中使用 List.h,而 std::list insert 方法返回

一个 iteratorListTraits.hinsert 方法签名很奇怪。这些是类:

列表.h

template <typename T> 
class List: public ListTraits<T> {
protected:
    std::list<T> list;
public:
    unsigned int size() {return 0;}

    ListTraits<T>& insert(const T& item) {     //<----------I think I should be returning iterator, but I have to return something of ListTraits<T> and that doesnt make sense
        typename std::list<T>::iterator it;
        list.insert(list.end(),  item);
        return it;
    }
    const T* getCurrentElement() const {
    
    }
    ...

和 ListTraits.h

    #pragma once

//------------ Declarations for List traits used in Test1 in main.cpp
template <typename T> class ListTraits
{
    public:
        virtual unsigned int size() = 0;
        virtual ListTraits& insert(const T& item) = 0; //<-----------------------INSERT METHOD HERE---#######
        virtual void print() = 0;
};

//------------ Declarations for List traits used in Test2 in main.cpp
template <typename T> class ListTraitsExtended
{
    public:
        virtual const T* getCurrentElement() const = 0;
        virtual void advance() = 0;
        virtual void rewind() = 0;
};

能否请您帮我完成 insert 方法,使其成为标准库 list.insert(it, value) 方法的模板版本?

2 个答案:

答案 0 :(得分:2)

改变

  return it;
}

  return *this;
}

这允许一种称为“方法链”的技术。

list.insert(a).insert(b).insert(c);

答案 1 :(得分:1)

有趣的是,如果您只需要在后面插入,我建议您更改 std::list<T> list;std::vector<T> data; 然后通过 data.push_back(item);

推送数据到里面

我上面说的可能不是这样,咳咳,就你而言,因为你必须实施 方法如:

T* getCurrentElement();
void advance();
void rewind();

这可能意味着您必须保留一个指向“当前”元素的指针,以便在被询问时可以返回它,您还必须能够转到上一个元素或下一个元素,并且可能只插入在当前元素之后,而不是在最后插入。

例如,如果我们忽略这样一个事实,即这个赋值的整个想法是让你实现所谓的“双链表”(意味着你必须保留 HeadPtr、TailPtr 和 CurrentPtr 并相应地移动它们),可以通过在后面返回最后插入的元素并获取其地址来实现getCurrentElement。你不应该忘记检查是否有元素:

T* getCurrentElement()
{
    T* result = nullptr;
    if (!list.empty())
    {
        result = &list.back();
    }
    return result;
}

您真的应该检查一下 std::liststd::vector 中已经有哪些开箱即用的方法

相关问题