2017-03-22 55 views
0

中的模板問題您好,我正在嘗試在Qt中編寫一個模板類,同時這樣做我被卡住了一些錯誤,我已經閱讀了一些文章並開始根據我的要求構建示例如何解決Qt

template.h

#ifndef CSLCDTEMPLATE_H 
#define CSLCDTEMPLATE_H 

#include <QDialog> 
#include <QTimer> 
#include <QDebug> 
#include <QList> 
#include <QPixmap> 
#include <QPalette> 
#include <QStringList> 


template<class T> 
class LcdTemplate : public QDialog 
{ 
public: 
    LcdTemplate(); 
    void display(T); 
    T Getalue(); 

private slots: 
    void display(); 
private: 
    int indexVal; 
    T m_Obj; 
    QStringList nameList; 
}; 

#endif 
// CSLCDTEMPLATE_H 

template.cpp

#include "CSLcdTemplate.h" 

extern QStringList display_list; 

template <class T> 
LcdTemplate<T>::LcdTemplate() 
{ 
    qDebug()<<"Inside the Constructor of LCD Template"; 

    setWindowFlags(Qt::FramelessWindowHint); 
#ifdef GL11_QT 
    setGeometry(0,0,320,240); 
#endif 
#ifdef GL11_GNOME 
    setGeometry(2,20,316,200); 
#endif 
    setStyleSheet("background-color:yellow"); 

    indexVal = 0; 

    QTimer *timer = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), this, SLOT(display())); 
    timer->start(500); 

    QTimer::singleShot(4000, this, SLOT(close())); 
} 

//template <class T> 
void LcdTemplate::display() 
{ 

    nameList = display_list; 
    qDebug()<<"Data in"<<nameList; 
    display(nameList); 

} 

template <class T> 
void LcdTemplate<T>::display(T list) 
{ 
    switch(indexVal) 
    { 
    case 0: 
     this->setStyleSheet(nameList.at(indexVal)); 
     indexVal = 1; 
     break; 
    case 1: 
     this->setStyleSheet(nameList.at(indexVal)); 
     indexVal = 2; 
     break; 
    case 2: 
     this->setStyleSheet(nameList.at(indexVal)); 
     indexVal = 3; 
     break; 
    case 4: 
     this->setStyleSheet(nameList.at(indexVal)); 
     indexVal = 4; 
     break; 
    case 5: 
     this->setStyleSheet(nameList.at(indexVal)); 
     indexVal = 0; 
     break; 
    } 
} 

template <class T> 
T TestTemp<T>::Getalue() 
{ 
    return m_Obj; 
} 

我面對的錯誤是

CSLcdTemplate.cpp:29:6: error: 'template<class T> class LcdTemplate' used without template parameters 
CSLcdTemplate.cpp: In function 'void display()': 
CSLcdTemplate.cpp:32:5: error: 'nameList' was not declared in this scope 
CSLcdTemplate.cpp: At global scope: 
CSLcdTemplate.cpp:67:11: error: expected initializer before '<' token 

我該如何解決這個錯誤。

+0

cpp文件中的模板實現?看看[這裏](https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl)。然而,有些情況下你仍然可以做到這一點,但總的來說你會失敗。 – Aconcagua

回答

0

不要混合模板類和負責信號和插槽的類。見QT : Templated Q_OBJECT class

注意,對於模板類成員定義正確的語法是

template <class T> 
void LcdTemplate<T>::display() 
{} 

請注意,您需要添加Q_OBJECT宏,以及用於信號和槽工作。

+0

我認爲不可能創建一個模板的QObject。最近有沒有改變? –

+0

我也在閱讀一些文章的同時尋找解決方案,所以我試圖使用繼承來構建示例,但我無法實現使用繼承too.Looking更詳細的示例。 – Mounika

+0

@Mounika不要這樣做。你能否引出你認爲你需要繼承的原因? – UmNyobe