2016-05-02 16 views
0

kann mir jemand sagen, wie man dieses Problem in C++ löst?C++ sfinae Designmuster

Fehler

keine Übereinstimmung für 'Betreiber < <' (Operandentypen sind 'QList' und 'Form1 *') * this-> Liste < < form1;

myobj.h

#ifndef MYOBJ_H 
#define MYOBJ_H 
#include <QList> 
#include "form.h" 
#include "form1.h" 

template <typename T> 
class MyObj 
{ 
public: 
    MyObj(QList<T*>* list) 
    { 
     this->list = list; 

     if (std::is_same<T,Form>::value) { 
      form = new Form; 
      *this->list << form; 
     } 
     if (std::is_same<T,Form1>::value) { 
      form1 = new Form1; 
      *this->list << form1; 
     } 
    } 

    QList<T*>* list = NULL; 
    Form* form = NULL; 
    Form1* form1 = NULL; 
}; 

#endif // MYOBJ_H 

mainwindow.cpp

myObj = new MyObj<Form>(new QList<Form*>); 

danke für die Hilfe bei

I bearbeitet

+0

Dies sieht aus wie Sie kommen aus einem Java oder C# Hintergrund. Sie müssen nicht überall in C++ neue verwenden. Was möchten Sie mit dem Operator '<<' tun? –

+1

Was wollen Sie eigentlich mit '* this-> list << form erreichen?'? –

+0

sry wie gepostet 1 min nach dem Einreichen der Frage, habe ich eine Bearbeitung des Codes – Invader

Antwort

0

ich eine Antwort selbst zu veröffentlichen, Ursache Ich habe einen gefunden. Ist dies der richtige Ansatz, um das Problem zu lösen? Ich bin sehr an Designmustern interessiert.

#ifndef MYOBJ_H 
#define MYOBJ_H 
#include <QList> 
#include "form.h" 
#include "form1.h" 
#include <QDebug> 

template <typename T> 
class MyObj 
{ 
public: 
    MyObj(QList<T*>* list) 
    { 
     this->list = list; 

     if (std::is_same<T,Form>::value) { 
      form = new Form; 
      appendFunc(form); 
     } 
     else if (std::is_same<T,Form1>::value) { 
      form1 = new Form1; 
      appendFunc(form1); 
     } 
    } 

    QList<T*>* list = NULL; 
    Form* form = NULL; 
    Form1* form1 = NULL; 

    template <typename U> 
    std::enable_if_t<std::is_same<T,U>::value,void> 
    appendFunc(U* a) { 
     qDebug() << "test100"; 
     *this->list << a; 
    } 

    void appendFunc(...) { } 
}; 

#endif // MYOBJ_H 

danke für mich

0

Warum nicht einfach die Template-Parameter helfen verwenden?

template <typename T> 
class MyObj 
{ 
public: 
    MyObj() 
    { 
     list.push_back(new T); 
    } 

private: 
    QList<T*> list; 
};