VS2013对模板代码的支持问题

clever101 2017-12-04 05:30:05
用VS2013编译一个历史项目(vc6.0编写的,以前在vc6.0上可以编译通过),有下面一段代码:

#ifndef PLUGINSTORE_H
#define PLUGINSTORE_H

#include <vector>
#include <string>

using namespace std;

template <class T>
class CPluginStore
{
public:
typedef T* (*PFUN_CREATE_OBJ)(int nIndex,void *pParam);
typedef struct _PLUGIN_INFO
{
PFUN_CREATE_OBJ pfCreateObj;
HMODULE hModule;
}PLUGIN_INFO;

public:
CPluginStore();
virtual ~CPluginStore();
bool AddPlugin(std::string strDll);
bool GetNext(PLUGIN_INFO &pi,bool bNext=true);
private:
vector<PLUGIN_INFO> m_plugVec;
vector<PLUGIN_INFO>::iterator m_plugIter;
};

template <class T>
CPluginStore<T>::CPluginStore()
{

}

template <class T>
CPluginStore<T>::~CPluginStore()
{
for (int i=0;i<m_plugVec.size();i++)
FreeLibrary(m_plugVec[i].hModule);
}

template <class T>
bool CPluginStore<T>::AddPlugin(std::string strDll)
{
PLUGIN_INFO pi;
pi.hModule=::LoadLibrary(strDll.c_str());
if (NULL==pi.hModule)
return false;
pi.pfCreateObj=(PFUN_CREATE_OBJ)::GetProcAddress(pi.hModule,"CreateObj");
if (NULL==pi.pfCreateObj)
{
FreeLibrary(pi.hModule);
return false;
}
m_plugVec.push_back(pi);
return true;
}

template <class T>
bool CPluginStore<T>::GetNext(PLUGIN_INFO &pi,bool bNext)
{
if (bNext)
m_plugIter++;
else
m_plugIter=m_plugVec.begin();
if (m_plugIter==m_plugVec.end())
return false;
pi=*m_plugIter;
return true;
}
#endif//PLUGINSTORE_H


出现编译错误:
1>e:\test\qtconsole\PluginStore.h(29): warning C4346: “std::vector<CPluginStore<T>::_PLUGIN_INFO,std::allocator<CPluginStore<T>::_PLUGIN_INFO>>::iterator”: 依赖名称不是类型
1> 用“typename”为前缀来表示类型
1> e:\test\qtconsole\PluginStore.h(31): 参见对正在编译的类 模板 实例化“CPluginStore<T>”的引用
1>e:\test\qtconsole\PluginStore.h(29): error C2146: 语法错误: 缺少“;”(在标识符“m_plugIter”的前面)
1>e:\src\test\qtconsole\PluginStore.h(29): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

分析了一下,主要问题是vector<PLUGIN_INFO>::iterator这个类型不能识别,于是把代码改为:

#ifndef PLUGINSTORE_H
#define PLUGINSTORE_H

#include <vector>
#include <string>

using namespace std;

template <class T>
class CPluginStore
{
public:
typedef T* (*PFUN_CREATE_OBJ)(int nIndex,void *pParam);
typedef struct _PLUGIN_INFO
{
PFUN_CREATE_OBJ pfCreateObj;
HMODULE hModule;
}PLUGIN_INFO;

typedef typename vector<PLUGIN_INFO>::iterator PluginInfoIter;

public:
CPluginStore();
virtual ~CPluginStore();
bool AddPlugin(std::string strDll);
bool GetNext(PLUGIN_INFO &pi,bool bNext=true);
private:
vector<PLUGIN_INFO> m_plugVec;
// vector<PLUGIN_INFO>::iterator m_plugIter;
vector<PluginInfoIter> m_plugIter;
};

template <class T>
CPluginStore<T>::CPluginStore()
{

}

template <class T>
CPluginStore<T>::~CPluginStore()
{
for (int i=0;i<m_plugVec.size();i++)
FreeLibrary(m_plugVec[i].hModule);
}

template <class T>
bool CPluginStore<T>::AddPlugin(std::string strDll)
{
PLUGIN_INFO pi;
pi.hModule=::LoadLibrary(strDll.c_str());
if (NULL==pi.hModule)
return false;
pi.pfCreateObj=(PFUN_CREATE_OBJ)::GetProcAddress(pi.hModule,"CreateObj");
if (NULL==pi.pfCreateObj)
{
FreeLibrary(pi.hModule);
return false;
}
m_plugVec.push_back(pi);
return true;
}

template <class T>
bool CPluginStore<T>::GetNext(PLUGIN_INFO &pi,bool bNext)
{
if (bNext)
m_plugIter++;
else
m_plugIter=m_plugVec.begin();
if (m_plugIter==m_plugVec.end())
return false;
pi=*m_plugIter;
return true;
}
#endif//PLUGINSTORE_H


原来的编译错误解决了,出现了新的编译错误,集中在GetNext函数:
template <class T>
bool CPluginStore<T>::GetNext(PLUGIN_INFO &pi,bool bNext)
{
if (bNext)
// 错误 5 error C2676: 二进制“++”:“std::vector<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<CPluginStore<ILSTool>::_PLUGIN_INFO>>>,std::allocator<_Ty>>”不定义该运算符或到预定义运算符可接收的类型的转换
m_plugIter++;
else
//错误 6 error C2679: 二进制“=”: 没有找到接受“std::_Vector_iterator<std::_Vector_val<std::_Simple_types<CPluginStore<ILSTool>::_PLUGIN_INFO>>>”类型的右操作数的运算符(或没有可接受的转换)
m_plugIter=m_plugVec.begin();

// 错误 7 error C2678: 二进制“==”: 没有找到接受“std::vector<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<// CPluginStore<ILSTool>::_PLUGIN_INFO>>>,std::allocator<_Ty>>”类型的左操作数的运算符(或没有可接受的转换)
if (m_plugIter==m_plugVec.end())

return false;

pi=*m_plugIter; // 错误 8 error C2100: 非法的间接寻址

return true;
}

请问如何解决呢?
...全文
126 6 点赞 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
clever101 2017-12-05
引用 4 楼 hdt 的回复:
我还是那句话,如果没有对模板语法有详细的了解,不要涉及它 vector<PLUGIN_INFO> m_plugVec; vector<PLUGIN_INFO>::iterator m_plugIter;//这个代表某个vector的迭代器,这里完全没必要定义,因为一个迭代器必然与一个容器相关,你定义了一个容器,再定一个迭代器的成员变量。完全是脱裤子放屁,如果这个迭代器不涉及容器,完全是无本之木
学习了,因为这个是历史项目,所以问题难免很多。
  • 打赏
  • 举报
回复
clever101 2017-12-05
引用 3 楼 paschen 的回复:
vector<PLUGIN_INFO>::iterator m_plugIter 改成: typename vector<PLUGIN_INFO>::iterator m_plugIter
改成这样对了。
  • 打赏
  • 举报
回复
我还是那句话,如果没有对模板语法有详细的了解,不要涉及它 vector<PLUGIN_INFO> m_plugVec; vector<PLUGIN_INFO>::iterator m_plugIter;//这个代表某个vector的迭代器,这里完全没必要定义,因为一个迭代器必然与一个容器相关,你定义了一个容器,再定一个迭代器的成员变量。完全是脱裤子放屁,如果这个迭代器不涉及容器,完全是无本之木
  • 打赏
  • 举报
回复
paschen 版主 2017-12-04
vector<PLUGIN_INFO>::iterator m_plugIter 改成: typename vector<PLUGIN_INFO>::iterator m_plugIter
  • 打赏
  • 举报
回复
clever101 2017-12-04
引用 1 楼 paschen 的回复:
#include <iterator>
不对,不是这个问题。#include <iterator>基本就不用包含。
  • 打赏
  • 举报
回复
paschen 版主 2017-12-04
#include <iterator>
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2017-12-04 05:30
社区公告
暂无公告