最近我们数据采集组的采集和存储程序需要一个Stop功能,为了采集端和存储端的代码兼容,我想用C++类模板来写,在用gcc编译类模板的时候出现了问题,跟vs2010下编译方法不同,vs2010下面支持分离式编译(包含编译),但是gcc下不支持,
(1)vs2010下模板编译的3种方法:
1.模板的声明和实现均在一个头文件netKill.h,main.cpp中包含头文件使用类模板:
//netKill.h
#ifndef NETKILL_H
#define NETKILL_H
#include<set>
#include<string>
#include<sstream>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<fstream>
//#include<pthread.h>
template<typename T>
class NetKill{
private:
std::set<T> ids;
std::set<T> hasExitIds;
public:
void killIds();
void clearIds();
void addId(T pid);
void deleteId(T pid);//sig_child
void printIds();//for debug
};
template<typename T>
void NetKill<T>::addId(T id){
std::cout<<"add"<<std::endl;
ids.insert(id);
}
template<typename T>
void NetKill<T>::clearIds(){
ids.clear();
hasExitIds.clear();
}
template<typename T>
void NetKill<T>::deleteId(T id){
hasExitIds.insert(id);
}
template<typename T>
void NetKill<T>::killIds(){
std::ofstream fOut("kill.txt");
if(!fOut)std::cout<<"open file error"<<std::endl;
for(std::set<T>::const_iterator cit=ids.begin();cit!=ids.end();cit++){
std::string cmdKill("kill -9 ");
std::stringstream strm;
strm<<*cit;
std::string mid;
strm>>mid;
cmdKill+=mid;
std::set<T>::iterator flag=hasExitIds.find(*cit);
if(flag==hasExitIds.end()){
fOut<<cmdKill<<std::endl;
std::cout<<cmdKill<<std::endl;
//system(cmdKill.c_str());
}
}//for
fOut.clear();
fOut.close();
clearIds();
}
template<typename T>
void NetKill<T>::printIds(){//for debug
std::ofstream fOut("test.txt");
if(!fOut)std::c