• 6532阅读
  • 10回复

跟C++模板有关的一个问题,大家帮忙看看吧! [复制链接]

上一主题 下一主题
离线xiaobaiwen
 
只看楼主 正序阅读 楼主  发表于: 2008-12-21
— 本帖被 XChinux 执行加亮操作(2009-01-06) —
我在论坛里找了个叫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
离线xiaobaiwen
只看该作者 10楼 发表于: 2008-12-23
引用第9楼water_wf于2008-12-23 09:44发表的  :
汗,里面使用Phonon模块了,编译不了,lz帮不了忙了


你没有安装这个模块吗??  没有就算了吧,  还是很感谢你!!
离线water_wf

只看该作者 9楼 发表于: 2008-12-23
汗,里面使用Phonon模块了,编译不了,lz帮不了忙了
离线water_wf

只看该作者 8楼 发表于: 2008-12-23
一会编译一下
离线xiaobaiwen
只看该作者 7楼 发表于: 2008-12-22
引用第6楼water_wf于2008-12-22 13:43发表的  :
我又看了下,明白了,你在Manager 前面加上typename 就可以了,突然想起来,这是g++的问题,它不会自动把 manager::iterator认为是一个声明,加个typename即可



谢谢你的回复,这个模板的问题已经搞定,不过又有了些新问题,我改了些,还是有些问题一时间没搞定。C++基础不是很好, water_wf要是有空能否在linux下编译一下这个源码。不是很着急,高手什么时候闲着没事,就看看吧!! 谢谢啦!!!
离线water_wf

只看该作者 6楼 发表于: 2008-12-22
我又看了下,明白了,你在Manager 前面加上typename 就可以了,突然想起来,这是g++的问题,它不会自动把 manager::iterator认为是一个声明,加个typename即可
离线xiaobaiwen
只看该作者 5楼 发表于: 2008-12-22
引用第2楼water_wf于2008-12-22 00:29发表的 :
这应该没有问题吧,用法没错
不行加上#include <map>
using namespace std;
我明天看看,这是标准用法


我已经按照你的说法添加了上面两句,问题依然存在,而且是一样的,
软件的作者发的原帖在这:http://www.qtcn.org/bbs/read.php?tid=9131&fpage=2

你要是有空可以看看,我改的前面几个问题,都比较简单,主要是promoted widget的依赖的.h文件的大小写,是因为在windows下不区分文件的大小写,而linux区分,你打开后在desinger下改下就行了。
要是哪位高人也碰巧看到这个帖子而且在linux下 方便的话,能否编译一下看看,是否行得通,有可能是我的环境有问题。不过我用这个环境已经做了两个课设了,没什么问题
离线xiaobaiwen
只看该作者 4楼 发表于: 2008-12-22
引用第3楼water_wf于2008-12-22 09:41发表的  :
不知道楼主什么问题,这种用法肯定正确的,fedora9 环境下,没编译这个,前面有很多问题,懒的改,要不你把你改过的发下


谢谢你的回复,这部分的代码我没改过。我们宿舍不能上网了,我在别人电脑上上,没代码。我一会儿回去再看看,如果还有问题就发给大家看看!
离线water_wf

只看该作者 3楼 发表于: 2008-12-22
不知道楼主什么问题,这种用法肯定正确的,fedora9 环境下,没编译这个,前面有很多问题,懒的改,要不你把你改过的发下
离线water_wf

只看该作者 2楼 发表于: 2008-12-22
这应该没有问题吧,用法没错
不行加上#include <map>
using namespace std;
我明天看看,这是标准用法
离线mumutouv

只看该作者 1楼 发表于: 2008-12-21
typedef std::map<QString, T*> Manager;
感觉代码有问题,就这一句就觉得有问题,怎么还去使用c++标准的数据结构,不如直接用QMap,
快速回复
限100 字节
 
上一个 下一个