我在论坛里找了个叫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