拥有自定义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(/*???*/);
}
如何在参数中设置对象类型?
答案 0 :(得分:0)
虽然you should not inherit from stl containers我会用同样的例子给你答案。
使用函数或类模板时,必须在header file中实现代码,否则,编译器将不会实例化正确的函数。定义函数模板时,编译器会为给定的类创建特定的函数模板类。例如,当您执行WList<Rectangle>
时,编译器会为模板WList
创建Rectangle
的实例。为此,编译器需要编译代码中的所有函数/类模板,否则,某些函数(不在头文件中的函数)将丢失并且func is not defined
或undefined 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
优于class
至avoid 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;
!