error C2059: syntax error: 'constant' (Konstruktorproblem)



  • Hi zusammen,

    hat einer eine Idee, wieso folgendes passiert:

    erstmal, ohne den nachfolgend beschriebenen Konstruktor funktioniert alles einwandfrei. Jetzt habe ich einen Konstruktor zu meiner Klasse CCustomTabCtrl hinzugefügt:

    .h file

    CCustomTabCtrl(int Type);
    

    .cpp file

    CCustomTabCtrl::CCustomTabCtrl(int Type) : m_PreviousTab(0), m_MaxWidth(0), m_MaxHeight(0), TabType(Type) 
    { 
       ...
    }
    

    in einer Dialogklasse wird nun ein Objekt von CCustomTabCtrl erzeugt

    CCustomTabCtrl TabRow1(0);
    

    Von Visual Studio bekomme ich nun den Fehler "error C2059: Syntaxfehler: 'Konstante'"

    Aus irgendeinem Grund mag der Compiler es nicht, dass ich den CCustomTabCtrl Konstruktor mit einer Konstanten aufrufe.

    Ich poste das ganze hier, weil ich vermute, dass mir Grundkenntnisse bzgl. Konstruktoren fehlen. Die FAQ zum Thema Konstruktor haben mir bei dem Problem leider auch nicht helfen können.

    Gruß
    Sed



  • Ist das der Originalcode? zeig mal bitte die komplette Klassendefinition, so wie du sie im Header hast.



  • class CCustomTabCtrl : public CTabCtrl 
    {
    	CWnd* m_Parent;
    	int m_PreviousTab;
    	int NrTabs;
    	int TabType;
    	CTabPage1 m_Tab1[12];
    	CTabPage2 m_Tab2[12];
    	CTabPage3 m_Tab3[12];
    	CTabPage4 m_Tab4[12];
    	CTabPage5 m_Tab5[12];
    	CDialog *m_pDialogs[12];			
    	int m_MaxWidth, m_MaxHeight;
    
    	BOOL CreateTab(CDialog *, UINT, int);
    
    public:
    	CCustomTabCtrl();
    	CCustomTabCtrl(int);
    
    // Overrides
    	protected:
    	virtual void PreSubclassWindow();
    	//}}AFX_VIRTUAL
    
    // Implementation
    public:
    	virtual ~CCustomTabCtrl() {};
    
    	// Generated message map functions
    protected:
    	//{{AFX_MSG(CCustomTabCtrl)
    	afx_msg void OnSelChange(NMHDR* pNMHDR, LRESULT* pResult);
    	//}}AFX_MSG
    
    	DECLARE_MESSAGE_MAP()
    };
    

    Ein Punkt, der mir grad noch einfällt, der eventuell was damit zu tun hat:
    Der Aufruf

    CCustomTabCtrl TabRow1(0);
    

    passiert in der Headerdatei eines Dialogfensters. Die .h und .cpp files dieses Dialogfensters sind per Ressourceneditor generiert worden und enthalten eben bis auf diese Zeile keinen eigenen Code von mir.
    Mag der Compiler es nicht, dass der Konstruktor aus dem Headerfile aufgerufen wird?



  • ich bekomme übrigens die selbe Fehlermeldung, wenn ich nur den Standardkonstruktor drin habe und den anderen auskommentiert habe. Dabei aber trotzdem die Zeile

    CCustomTabCtrl TabRow1(0);
    

    ausführe...statt

    CCustomTabCtrl TabRow1;
    

    findet er den konstruktor erst gar nicht?



  • Was ist denn CTabPage1..5? Existieren die? Vllt CTabPage?



  • ja, die existieren. Wie gesagt, bevor ich den zweiten Konstruktor (CCustomTabCtrl(int)) hinzugefügt habe, hat alles einwandfrei funktioniert.

    Wenn ich ein Objekt mittels

    CCustomTabCtrl TabRow1;
    

    erzeuge, klappt es auch, nur dass ich halt den Parameter "type" nicht verwenden kann.



  • Dann bitte auch noch den Header wo du den Ctor aufrufst...

    Ich rate jetzt mal: du deklarierst eine Membervariable und versuchst sie gleichzeitig zu initalisieren?



  • So, sorry für die langsame Antwort.

    Tab1.h:

    pragma once
    #include "Resource.h"
    #include "afxcmn.h"
    #include "CustomTabCtrl.h"
    
    // Dialogfeld
    
    class CTab1 : public CDialog
    {
    	DECLARE_DYNAMIC(CTab1)
    
    public:
    	CTab1(CWnd* pParent = NULL);   // Standardkonstruktor
    	virtual ~CTab1();
    
    // Dialogfelddaten
    	enum { IDD = IDD_DIALOG_HAM };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    
    	DECLARE_MESSAGE_MAP()
    public:
    	CCustomTabCtrl TabRow1(0);
    
    };
    

    Deklarieren und initialisieren gleichzeitig ja... aber ist keine Membervariable (oder?)
    Ich lege eben in der Headerdatei eines Dialogfensters ein TabCtrl Objekt an, welches gleichzeitig mittels des Konstruktors initialisiert werden soll.



  • Ich reduzier das mal aufs relevante:

    Sed98 schrieb:

    class CTab1 : public CDialog
    {
    public:
    	CCustomTabCtrl TabRow1(0);
    };
    

    Das ist kein gültiges C++. Man könnte das jetzt als folgendes interpretieren:

    a) Du deklarierst eine Membervariable CTabl::TabRowl vom Typ CCustomTabCtrl und gits ihr einen Initialisierer mit, was in C++ nicht erlaubt ist. Initialisierungen von nichtstatischen Membern finden im Konstruktor in der Initialisirungsliste statt.

    b) Du deklarierst eine Funktion CTabl::TabRowl, die ein CCustomTabCtrl zurückgibt, mit einer Parameterliste (0), was auch nicht gültig ist. Parameterlisten bestehen aus Typnamen, getrennt mit Kommata und jeweils von einem Optionalen Parameternamen gefolgt.



  • ah okay, verstehe... gemeint war a).
    dann hab ich grad wieder was, zugegebenermaßen sehr grundlegendes, dazu gelernt.

    danke 🙂


Anmelden zum Antworten