把Qt程序 从windows移植到linux下 碰到一个C++模板问题,大家看看

xiaobaiwen 2008-12-22 12:08:48
我在qtcn.org论坛里找了个叫MyWord的软件,是在windows下用Qt4+vc2008开发的,我把源码放到linux下编译出现了一些问题,自己解决了部分,还有一个不太懂,用的应该是C++中的模板,不过GCC对这个支持应该也很好阿。
为什么在linux下会出现问题呢??是定义的迭代器不能被识别???
MySetting.h文件编译时有如下的错误提示:
In file included from UserSetting.h:7,
from MainWindow.h:7,
from BatchImportDlg.cpp:4:
MySetting.h: In static member function ‘static T* MySetting<T>::getInstance(const QString&)’:
MySetting.h:50: error: expected `;' before ‘it’
MySetting.h:51: error: ‘it’ was not declared in this scope
MySetting.h: In static member function ‘static void MySetting<T>::destroySettingManager()’:
MySetting.h:76: error: expected `;' before ‘it’
MySetting.h:76: error: ‘it’ was not declared in this scope
make[1]: Leaving directory `/home/michael/sda5/Programming/Qt/forEclipse/src'
make[1]: *** [debug/BatchImportDlg.o] Error 1
make: *** [debug] Error 2

源文件如下:这个应该是定义的模板类,我没用过,不知道是什么原因。大家是否可以帮忙看看
/*
* Setting Manager, derived from QSetting
*/

#ifndef MYSETTING_H
#define MYSETTING_H

#include <QSettings>
#include <QDir>

template <class T>
class MySetting : public QSettings
{
typedef std::map<QString, T*> Manager;

public:
QString getUserName() const { return userName; }

static QString findUser(const QString& section, const QVariant& v);
static T* getInstance(const QString& userName);
static void destroySettingManager();

protected:
MySetting(const QString& name);
MySetting(const MySetting& other);
MySetting& operator = (const MySetting& other);
virtual ~MySetting() {}

virtual void loadDefaults() = 0;

private:
static Manager settingManager;
QString userName;
};

template <class T>
MySetting<T>::MySetting(const QString& name)
: QSettings(name+".ini", IniFormat), userName(name) {}


//////////////////////////////////////////////////////////////////////////
// SettingManager
template <class T>
typename MySetting<T>::Manager MySetting<T>::settingManager;

template <class T>
T* MySetting<T>::getInstance(const QString& userName)
{
Manager::iterator it = settingManager.find(userName);
if(it != settingManager.end())
return it->second;

T* setting = new T(userName);
settingManager.insert(std::make_pair(userName, setting));
return setting;
}

template <class T>
QString MySetting<T>::findUser(const QString& section, const QVariant& v)
{
// search all ini files
const QStringList files = QDir().entryList(QStringList() << "*.ini", QDir::Files);
foreach(QString file, files)
{
QSettings setting(file, QSettings::IniFormat);
if(setting.value(section) == v)
return file.left(file.length() - 4); // - .ini
}
return QString();
}

template <class T>
void MySetting<T>::destroySettingManager()
{
for(Manager::iterator it = settingManager.begin(); it != settingManager.end(); ++it)
delete it->second;
settingManager.clear();
}

#endif // MYSETTING_H
...全文
431 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobaiwen 2008-12-23
  • 打赏
  • 举报
回复
问题解决:
在 Manager::iterator it 前加typename

ooily 2008-12-22
  • 打赏
  • 举报
回复
mark

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧