免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2961 | 回复: 6
打印 上一主题 下一主题

windows下运行良好的C++/Qt程序移到linux下模板出现问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-09 21:07 |只看该作者 |倒序浏览
本来是windows下的源码,移到linux下就有问题了,改了一些,还是有写问题
在模板类中明明有构造函数是MySetting,为什么会错误提示说没有这个MySetting域
为什么linux和windows下的模板使用还有这么大的区别??
大家看看是MySetting.h中的模板定义出了问题?还是UserSetting类中的实现出了问题??

错误提示如下:

UserSetting.cpp: In constructor ‘UserSetting::UserSetting(const QString&)’:
UserSetting.cpp:6: error: class ‘UserSetting’ does not have any field named ‘MySetting’
UserSetting.cpp:6: error: no matching function for call to ‘MySetting<UserSetting>::MySetting()’
MySetting.h:28: note: candidates are: MySetting<T>::MySetting(const MySetting<T>&) [with T = UserSetting]
MySetting.h:58: note:                 MySetting<T>::MySetting(const QString&) [with T = UserSetting]
make[1]: Leaving directory `/home/michael/sda5/Programming/Qt/forEclipse/src'
make[1]: *** [debug/UserSetting.o] Error 1
make: *** [debug] Error 2


有关的三个源文件如下:
MySetting.h

/*
*    Setting Manager, derived from QSetting
*/


#ifndef MYSETTING_H
#define MYSETTING_H

#include <map>
#include <QSettings>
#include <QDir>

using namespace std;

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)
{
    typename 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(typename Manager::iterator it = settingManager.begin(); it != settingManager.end(); ++it)
        delete it->second;
    settingManager.clear();
}

#endif // MYSETTING_H



UserSetting.h
#ifndef USERSETTING_H
#define USERSETTING_H

#include <QFont>
#include <QColor>
#include <QKeySequence>
#include "MySetting.h"

struct DictSetting
{
    int     unitSize;
    int     currentUnit;
    int     threshold1;
    int     threshold2;
    bool    showNew;
    bool    showUnFamiliar;
    bool    showFamiliar;
};

class UserSetting : public MySetting<UserSetting>
{
public:
    UserSetting(const QString& name);
    QFont        getFont    (const QString& section) const;
    QColor       getColor   (const QString& section) const;
    QKeySequence getShortcut(const QString& section) const;
    int          getSize    (const QString& section) const;
    void         setFont    (const QString& section, const QFont& font);
    void         setColor   (const QString& section, const QColor& color);
    void         setShortcut(const QString& section, const QKeySequence& keySequence);
    void         setSize    (const QString& section, int size);
    bool        containsDictSetting(const QString& dictName) const;
    DictSetting getDictSetting     (const QString& dictName);
    void        setDictSetting     (const QString& dictName, const DictSetting& setting);

private:
    void loadDefaults();
};

#endif // USERSETTING_H



[ 本帖最后由 xiaobaiwen 于 2009-1-9 21:15 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-01-09 21:09 |只看该作者
UserSetting.cpp(前部分)

#include "UserSetting.h"
#include <QDesktopWidget>
#include <QApplication>
#include <QFile>

UserSetting::UserSetting(const QString& name) : MySetting(name)
{
&nbsp;&nbsp;&nbsp;&nbsp;if(QFile(name + ".ini").size() == 0)   // no setting

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadDefaults();
}

void UserSetting::loadDefaults()
{
&nbsp;&nbsp;&nbsp;&nbsp;if(getUserName() == "Global")
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("dbFileName", "word.db");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("WavDir",     "Sound");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("Mp3Dir",     "Mp3");
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setFont("tableFont",    QFont(tr("Arial"),      11));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setFont("wordFont",     QFont(tr("Arial"),      72, QFont::Bold));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setFont("phoneticFont", QFont(tr("TOPhonetic"), 18, QFont::Normal));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setFont("chineseFont",  QFont(tr("宋体"),       20, QFont::Bold));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setFont("noteFont",     QFont(tr("Arial"),      16));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setFont("guiFont",      QFont(tr("宋体"),       10));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setColor("newWordColor",    QColor(Qt::red));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setColor("unFamiliarColor", QColor(Qt::gray));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setColor("familiarColor",   QColor(Qt::darkGreen));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setColor("phoneticColor",   QColor(Qt::darkBlue));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setShortcut("rightShortcut",       QString("Right"));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setShortcut("wrongShortcut",       QString("Left"));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setShortcut("chineseShortcut",     QString("Ctrl+H"));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setShortcut("setNewShortcut",      QString("Ctrl+N"));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setShortcut("setFamiliarShortcut", QString("Ctrl+F"));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beginGroup("Other");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("filteredChar", tr(",。;、的"));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("isDefault",    false);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("currentDict",  QString());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("autoBackup",   true);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("backupDays",   7);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endGroup();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beginGroup("LeftPanel");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("autoHide",  true);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("hideDelay", 5);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("showDelay", 1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endGroup();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSize("LeftSplitterLeft",      300);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSize("LeftSplitterRight",     700);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSize("VerticalSplitterUp",    350);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSize("VerticalSplitterDown",  450);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSize("DetailSplitterEnglish", 200);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSize("DetailSplitterChinese", 100);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSize("DetailSplitterNote",    150);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beginGroup("ButtonStatus");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("Recite",         false);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("Upper",          false);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue("HideControlBar", false);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endGroup();
&nbsp;&nbsp;&nbsp;&nbsp;}
}

论坛徽章:
0
3 [报告]
发表于 2009-01-09 21:11 |只看该作者
UserSetting.cpp(后部分)
QFont UserSetting::getFont(const QString& section) const
{
&nbsp;&nbsp;&nbsp;&nbsp;QFont font;
&nbsp;&nbsp;&nbsp;&nbsp;font.fromString(value("Font/" + section).toString());
&nbsp;&nbsp;&nbsp;&nbsp;return font;
}
QColor UserSetting::getColor(const QString& section) const {
&nbsp;&nbsp;&nbsp;&nbsp;return value("Color/" + section).toInt();
}
QKeySequence UserSetting::getShortcut(const QString& section) const {
&nbsp;&nbsp;&nbsp;&nbsp;return QKeySequence(value("Shortcut/" + section).toString());
}
int UserSetting::getSize(const QString& section) const {
&nbsp;&nbsp;&nbsp;&nbsp;return value("Sizes/" + section).toInt();
}
void UserSetting::setFont(const QString& section, const QFont& font) {
&nbsp;&nbsp;&nbsp;&nbsp;setValue("Font/" + section, font.toString());
}
void UserSetting::setColor(const QString& section, const QColor& color) {
&nbsp;&nbsp;&nbsp;&nbsp;setValue("Color/" + section, color.rgb());
}
void UserSetting::setShortcut(const QString& section, const QKeySequence& keySequence){
&nbsp;&nbsp;&nbsp;&nbsp;setValue("Shortcut/" + section, keySequence.toString());
}
void UserSetting::setSize(const QString& section, int size) {
&nbsp;&nbsp;&nbsp;&nbsp;setValue("Sizes/" + section, size);
}

DictSetting UserSetting::getDictSetting(const QString& dictName)
{
&nbsp;&nbsp;&nbsp;&nbsp;DictSetting result;
&nbsp;&nbsp;&nbsp;&nbsp;beginGroup(dictName);
&nbsp;&nbsp;&nbsp;&nbsp;result.unitSize       = value("unitSize")      .toInt();
&nbsp;&nbsp;&nbsp;&nbsp;result.currentUnit    = value("currentUnit")   .toInt();
&nbsp;&nbsp;&nbsp;&nbsp;result.threshold1     = value("threshold1")    .toInt();
&nbsp;&nbsp;&nbsp;&nbsp;result.threshold2     = value("threshold2")    .toInt();
&nbsp;&nbsp;&nbsp;&nbsp;result.showNew        = value("showNew")       .toBool();
&nbsp;&nbsp;&nbsp;&nbsp;result.showUnFamiliar = value("showUnFamiliar").toBool();
&nbsp;&nbsp;&nbsp;&nbsp;result.showFamiliar   = value("showFamiliar")  .toBool();
&nbsp;&nbsp;&nbsp;&nbsp;endGroup();
&nbsp;&nbsp;&nbsp;&nbsp;return result;
}

void UserSetting::setDictSetting(const QString& dictName, const DictSetting& setting)
{
&nbsp;&nbsp;&nbsp;&nbsp;beginGroup(dictName);
&nbsp;&nbsp;&nbsp;&nbsp;setValue("unitSize",       setting.unitSize);
&nbsp;&nbsp;&nbsp;&nbsp;setValue("currentUnit",    setting.currentUnit);
&nbsp;&nbsp;&nbsp;&nbsp;setValue("threshold1",     setting.threshold1);
&nbsp;&nbsp;&nbsp;&nbsp;setValue("threshold2",     setting.threshold2);
&nbsp;&nbsp;&nbsp;&nbsp;setValue("showNew",        setting.showNew);
&nbsp;&nbsp;&nbsp;&nbsp;setValue("showUnFamiliar", setting.showUnFamiliar);
&nbsp;&nbsp;&nbsp;&nbsp;setValue("showFamiliar",   setting.showFamiliar);
&nbsp;&nbsp;&nbsp;&nbsp;endGroup();
}

bool UserSetting::containsDictSetting(const QString& dictName) const {
&nbsp;&nbsp;&nbsp;&nbsp;return childGroups().contains(dictName);
}

论坛徽章:
0
4 [报告]
发表于 2009-01-10 19:17 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2009-01-10 19:39 |只看该作者
在哪报错了?你得指出来啊,你有源代码可以直接定位,网友可没有

论坛徽章:
0
6 [报告]
发表于 2009-01-10 19:42 |只看该作者
UserSetting::UserSetting(const QString& name) : MySetting(name)
改为:
UserSetting::UserSetting(const QString& name) : MySetting<UserSetting>(name)
试试看

评分

参与人数 1可用积分 +2 收起 理由
samon_fu + 2 我很赞同。

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2009-01-10 21:05 |只看该作者
原帖由 tyc611 于 2009-1-10 19:42 发表
UserSetting::UserSetting(const QString& name) : MySetting(name)
改为:
UserSetting::UserSetting(const QString& name) : MySetting(name)
试试看



问题搞定,非常感谢 高手相助
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP