如何扩展std :: list并创建自定义函数?

时间:2018-01-21 21:52:09

标签: c++ list std extends

拥有自定义std :: list类助手:

#ifndef __WLIST_H

    #define __WLIST_H

    #include <list>
    using namespace std;

    template <class T >
    class WList : public std::list<T>
    {
        public:
            void wAdd();
            void wRemove();
            bool wContains();
            void wGet();
            void wClear();
            int  wSize();

    };

#endif /*__WLIST_H*/

如何在类声明中声明自定义add新项??

#include "WList.h"

template<class T>
void WList<T>::wAdd(/*???*/)
{
    this->push_back(/*???*/);
}

如何在参数中设置对象类型?

2 个答案:

答案 0 :(得分:0)

虽然you should not inherit from stl containers我会用同样的例子给你答案。

使用函数或类模板时,必须在header file中实现代码,否则,编译器将不会实例化正确的函数。定义函数模板时,编译器会为给定的类创建特定的函数模板类。例如,当您执行WList<Rectangle>时,编译器会为模板WList创建Rectangle的实例。为此,编译器需要编译代码中的所有函数/类模板,否则,某些函数(不在头文件中的函数)将丢失并且func is not definedundefined reference to func错误发生。

您的代码应该是:

<强> WList.h

#include <list>

template <typename T >
class WList : public std::list<T>
{
public:
    void wAdd(T obj)
    {
        this->push_back(obj);
    }    
};

#include <list>

 template <typename T >
 class WList: public std::list<T>
 {
     public:
         void wAdd(T obj);

 };

 template<typename T>
 void WList<T>::wAdd(T obj)
 {
     this->push_back(obj);
 }

主要

int main() {

    WList<double> list;
    list.wAdd(2);
}

更合适的方法将不会继承stl容器:

#include <list>

template <typename T >
class WList
{
public:
    void wAdd(T obj)
    {
        m_data.push_back(obj);
    }    
protected:
    std::list<T> m_data;
};

此外,请注意,在template<typename T>作为模板和template<class T>作为模板之间使用class优于classavoid static ambiguity定义

答案 1 :(得分:0)

在C ++ 11中,如果它可用:

模板需要在头文件中定义,您可以在类中编写:

void wAdd(T&& obj) { this->push_back(std::move(obj)); }   
void wAdd(const T& obj) { this->push_back(obj); }

您可能还想考虑安抚语义:

template <typename... Ts>
void wEmplace(Ts&&... args) { this->emplace_back(std::forward<Ts>(args)...); }

不要在头文件中使用using namespace std;