• 4554阅读
  • 3回复

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

上一主题 下一主题
离线xiaobaiwen
 
只看楼主 倒序阅读 楼主  发表于: 2009-01-09
— 本帖被 XChinux 执行加亮操作(2009-01-14) —
本来是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
  1. /*
  2. *    Setting Manager, derived from QSetting
  3. */
  4. #ifndef MYSETTING_H
  5. #define MYSETTING_H
  6. #include <map>
  7. #include <QSettings>
  8. #include <QDir>
  9. using namespace std;
  10. template <class T>
  11. class MySetting : public QSettings
  12. {
  13.     typedef std::map<QString, T*> Manager;
  14. public:
  15.     QString getUserName() const { return userName; }
  16.     static QString findUser(const QString& section, const QVariant& v);
  17.     static T*      getInstance(const QString& userName);
  18.     static void    destroySettingManager();
  19. protected:   
  20.     MySetting(const QString& name);
  21.     MySetting(const MySetting& other);
  22.     MySetting& operator = (const MySetting& other);
  23.     virtual ~MySetting() {}
  24.     virtual void loadDefaults() = 0;
  25. private:
  26.     static Manager settingManager;
  27.     QString userName;
  28. };
  29. template <class T>
  30. MySetting<T>::MySetting(const QString& name)
  31.     : QSettings(name+".ini", IniFormat), userName(name) {}
  32. //////////////////////////////////////////////////////////////////////////
  33. // SettingManager
  34. template <class T>
  35. typename MySetting<T>::Manager MySetting<T>::settingManager;
  36. template <class T>
  37. T* MySetting<T>::getInstance(const QString& userName)
  38. {
  39.     typename Manager::iterator it = settingManager.find(userName);
  40.     if(it != settingManager.end())
  41.         return it->second;
  42.     T* setting = new T(userName);
  43.     settingManager.insert(std::make_pair(userName, setting));
  44.     return setting;
  45. }
  46. template <class T>
  47. QString MySetting<T>::findUser(const QString& section, const QVariant& v)
  48. {
  49.     // search all ini files
  50.     const QStringList files = QDir().entryList(QStringList() << "*.ini", QDir::Files);
  51.     foreach(QString file, files)
  52.     {
  53.         QSettings setting(file, QSettings::IniFormat);
  54.         if(setting.value(section) == v)
  55.             return file.left(file.length() - 4);  // - .ini
  56.     }
  57.     return QString();
  58. }
  59. template <class T>
  60. void MySetting<T>::destroySettingManager()
  61. {
  62.     for(typename Manager::iterator it = settingManager.begin(); it != settingManager.end(); ++it)
  63.         delete it->second;
  64.     settingManager.clear();
  65. }
  66. #endif // MYSETTING_H


UserSetting.h

  1. #ifndef USERSETTING_H
  2. #define USERSETTING_H
  3. #include <QFont>
  4. #include <QColor>
  5. #include <QKeySequence>
  6. #include "MySetting.h"
  7. struct DictSetting
  8. {
  9.     int    unitSize;
  10.     int    currentUnit;
  11.     int    threshold1;
  12.     int    threshold2;
  13.     bool    showNew;
  14.     bool    showUnFamiliar;
  15.     bool    showFamiliar;
  16. };
  17. class UserSetting : public MySetting<UserSetting>
  18. {
  19. public:
  20.     UserSetting(const QString& name);
  21.     QFont        getFont    (const QString& section) const;
  22.     QColor      getColor  (const QString& section) const;
  23.     QKeySequence getShortcut(const QString& section) const;
  24.     int          getSize    (const QString& section) const;
  25.     void        setFont    (const QString& section, const QFont& font);
  26.     void        setColor  (const QString& section, const QColor& color);
  27.     void        setShortcut(const QString& section, const QKeySequence& keySequence);
  28.     void        setSize    (const QString& section, int size);
  29.     bool        containsDictSetting(const QString& dictName) const;
  30.     DictSetting getDictSetting    (const QString& dictName);
  31.     void        setDictSetting    (const QString& dictName, const DictSetting& setting);
  32. private:
  33.     void loadDefaults();
  34. };
  35. #endif // USERSETTING_H
离线xiaobaiwen
只看该作者 1楼 发表于: 2009-01-09
UserSetting.cpp

  1. #include "UserSetting.h"
  2. #include <QDesktopWidget>
  3. #include <QApplication>
  4. #include <QFile>
  5. UserSetting::UserSetting(const QString& name) : MySetting(name)
  6. {
  7.     if(QFile(name + ".ini").size() == 0)  // no setting
  8.         loadDefaults();
  9. }
  10. void UserSetting::loadDefaults()
  11. {
  12.     if(getUserName() == "Global")
  13.     {
  14.         setValue("dbFileName", "word.db");
  15.         setValue("WavDir",    "Sound");
  16.         setValue("Mp3Dir",    "Mp3");
  17.     }
  18.     else
  19.     {
  20.         setFont("tableFont",    QFont(tr("Arial"),      11));
  21.         setFont("wordFont",    QFont(tr("Arial"),      72, QFont::Bold));
  22.         setFont("phoneticFont", QFont(tr("TOPhonetic"), 18, QFont::Normal));
  23.         setFont("chineseFont",  QFont(tr("宋体"),      20, QFont::Bold));
  24.         setFont("noteFont",    QFont(tr("Arial"),      16));
  25.         setFont("guiFont",      QFont(tr("宋体"),      10));
  26.         setColor("newWordColor",    QColor(Qt::red));
  27.         setColor("unFamiliarColor", QColor(Qt::gray));
  28.         setColor("familiarColor",  QColor(Qt::darkGreen));
  29.         setColor("phoneticColor",  QColor(Qt::darkBlue));
  30.         setShortcut("rightShortcut",      QString("Right"));
  31.         setShortcut("wrongShortcut",      QString("Left"));
  32.         setShortcut("chineseShortcut",    QString("Ctrl+H"));
  33.         setShortcut("setNewShortcut",      QString("Ctrl+N"));
  34.         setShortcut("setFamiliarShortcut", QString("Ctrl+F"));
  35.         beginGroup("Other");
  36.         setValue("filteredChar", tr(",。;、的"));
  37.         setValue("isDefault",    false);
  38.         setValue("currentDict",  QString());
  39.         setValue("autoBackup",  true);
  40.         setValue("backupDays",  7);
  41.         endGroup();
  42.         beginGroup("LeftPanel");
  43.         setValue("autoHide",  true);
  44.         setValue("hideDelay", 5);
  45.         setValue("showDelay", 1);
  46.         endGroup();
  47.         setSize("LeftSplitterLeft",      300);
  48.         setSize("LeftSplitterRight",    700);
  49.         setSize("VerticalSplitterUp",    350);
  50.         setSize("VerticalSplitterDown",  450);
  51.         setSize("DetailSplitterEnglish", 200);
  52.         setSize("DetailSplitterChinese", 100);
  53.         setSize("DetailSplitterNote",    150);
  54.         beginGroup("ButtonStatus");
  55.         setValue("Recite",        false);
  56.         setValue("Upper",          false);
  57.         setValue("HideControlBar", false);
  58.         endGroup();
  59.     }
  60. }
  61. QFont UserSetting::getFont(const QString& section) const
  62. {
  63.     QFont font;
  64.     font.fromString(value("Font/" + section).toString());
  65.     return font;
  66. }
  67. QColor UserSetting::getColor(const QString& section) const {
  68.     return value("Color/" + section).toInt();
  69. }
  70. QKeySequence UserSetting::getShortcut(const QString& section) const {
  71.     return QKeySequence(value("Shortcut/" + section).toString());
  72. }
  73. int UserSetting::getSize(const QString& section) const {
  74.     return value("Sizes/" + section).toInt();
  75. }
  76. void UserSetting::setFont(const QString& section, const QFont& font) {
  77.     setValue("Font/" + section, font.toString());
  78. }
  79. void UserSetting::setColor(const QString& section, const QColor& color) {
  80.     setValue("Color/" + section, color.rgb());
  81. }
  82. void UserSetting::setShortcut(const QString& section, const QKeySequence& keySequence){
  83.     setValue("Shortcut/" + section, keySequence.toString());
  84. }
  85. void UserSetting::setSize(const QString& section, int size) {
  86.     setValue("Sizes/" + section, size);
  87. }
  88. DictSetting UserSetting::getDictSetting(const QString& dictName)
  89. {
  90.     DictSetting result;
  91.     beginGroup(dictName);
  92.     result.unitSize      = value("unitSize")      .toInt();
  93.     result.currentUnit    = value("currentUnit")  .toInt();
  94.     result.threshold1    = value("threshold1")    .toInt();
  95.     result.threshold2    = value("threshold2")    .toInt();
  96.     result.showNew        = value("showNew")      .toBool();
  97.     result.showUnFamiliar = value("showUnFamiliar").toBool();
  98.     result.showFamiliar  = value("showFamiliar")  .toBool();
  99.     endGroup();
  100.     return result;
  101. }
  102. void UserSetting::setDictSetting(const QString& dictName, const DictSetting& setting)
  103. {
  104.     beginGroup(dictName);
  105.     setValue("unitSize",      setting.unitSize);
  106.     setValue("currentUnit",    setting.currentUnit);
  107.     setValue("threshold1",    setting.threshold1);
  108.     setValue("threshold2",    setting.threshold2);
  109.     setValue("showNew",        setting.showNew);
  110.     setValue("showUnFamiliar", setting.showUnFamiliar);
  111.     setValue("showFamiliar",  setting.showFamiliar);
  112.     endGroup();
  113. }
  114. bool UserSetting::containsDictSetting(const QString& dictName) const {
  115.     return childGroups().contains(dictName);
  116. }
离线xiaobaiwen
只看该作者 2楼 发表于: 2009-01-10
   
离线xiaobaiwen
只看该作者 3楼 发表于: 2009-01-10
chinaUnix上的高手:
UserSetting::UserSetting(const QString& name) : MySetting(name)
改为:
UserSetting::UserSetting(const QString& name) : MySetting<UserSetting>(name)
快速回复
限100 字节
 
上一个 下一个