Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Unerklärlicher Undefined Reference Error

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
01.03.2006, 20:57 Uhr
~RedStar
Gast


...obwohl die Reference meiner Ansicht nach defined ist . Egal, ich erklär das besser ausführlich:

Auszug aus dem Programm-Code:

table.h file:

C++:
typedef unsigned int uint;
typedef int nint;

using namespace std;

class table
{
    public:
    static const char LINEON = 0x1;
    static const char DOUBLELINE = 0x10;
    static const char DASHEDLINE = 0x100;
    static const char DOTTEDLINE = 0x1000;
    
    static const char STANDARDLINE = LINEON;
    static const float STANDARDWIDTH = 1.0;

...    
    void changeRowCount(nint relative);





table.cpp file:

C++:
...
void table::changeRowCount(nint relative)
{
    if ((nint)(rowcount) + relative < 1 )
        rowcount = 1;
    else
        rowcount = rowcount + relative;

    for (uint i = 0; i < columncount; i++)
    {
        cellcontent[i].resize(rowcount, "");}
        bottomlayout[i].resize(rowcount, STANDARDLINE);
        rightlayout[i].resize(rowcount, STANDARDLINE);
        bottomlinewidth[i].resize(rowcount, STANDARDWIDTH);
        rightlinewidth[i].resize(rowcount, STANDARDWIDTH);
    }
    return;
}



Wenn ich die obigen 4 Zeilen (die mit den großgeschriebenen Konstanten) rausnehme, compiliert er ohne Probleme, wenn ich sie drin lasse, bekomme ich den Error:

[Linker error] undefined reference to `table::STANDARDWIDTH'

Ich kann mich aber sonst in der Klasse so oft auf STANDARDWIDTH beziehen wie ich will - klar, weil ich die Konstanten in der Klasse definiert habe. Gerade deshalb erscheint mir dieser Fehler ja auch so rätselhaft.

Würd mich freuen, wenn jemand weiß, woran es liegen könnte...

MfG Red*Star

PS: Ich arbeite mit wx-DevCpp.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.03.2006, 21:24 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


mach ein


C++:
table::LINEON = 0x1;
// usw



in die cpp, wenn ich mich nich irre war das einer der bugs vom devcpp
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.03.2006, 21:49 Uhr
~RedStar
Gast


Ich nehme an, am Anfang der cpp... Hab ich gemacht, funzt aber leider immer noch nicht :



Code:
table.cpp:4: error: expected constructor, destructor, or type conversion before '=' token
table.cpp:4: error: expected `,' or `;' before '=' token



Wär aber zumindest schön, wenn es ein Dev-Cpp-Bug ist, dann muss ich mir nicht weiter das Hirn zermartern...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.03.2006, 22:59 Uhr
~RedStar
Gast


Jetzt wird es noch dämlicher: Das hier funktioniert:


C++:
{
            char temp = STANDARDLINE;
            float width = STANDARDWIDTH;

            cellcontent[i].resize(newrocount, value);

            bottomlayout[i].resize(newrocount, temp);
            rightlayout[i].resize(newrocount, temp);
            bottomlinewidth[i].resize(newrocount, width);
            rightlinewidth[i].resize(newrocount, width);
}



Und das hier nicht:

C++:
{
            cellcontent[i].resize(newrocount, value);

            bottomlayout[i].resize(newrocount, STANDARDLINE);
            rightlayout[i].resize(newrocount, STANDARDLINE);
            bottomlinewidth[i].resize(newrocount, STANDARDWIDTH);
            rightlinewidth[i].resize(newrocount, STANDARDWIDTH);
}





 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.03.2006, 00:27 Uhr
~RedStar
Gast


Ich bins - schon wieder . Ich bin jetzt durch einen anderen Fehler auf das /eigentliche/ Problem aufmerksam geworden. Nach etwas Googlen habe ich dann auch die Lösung gefunden - quote:

"Static constants do not get defined in the .h file. They get defined in the .cpp file. In the header file, you need to have an 'extern' reference to the constant. [...]"

(http://www.macosx.com/forums/showpost.php?p=1099031&postcount=46)


Gute Nacht,

Red*Star
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.03.2006, 08:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


jo das wollte ich mit meinem post oben ausdrücken.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.03.2006, 10:13 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von FloSoft:
mach ein


C++:
table::LINEON = 0x1;
// usw



in die cpp, wenn ich mich nich irre war das einer der bugs vom devcpp


Its not a bug, its a standard
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.03.2006, 10:22 Uhr
Tommix



Und wenn man

C++:
const char table::LINEON = 0x1;


schreibt, funktioniert's auch noch.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.03.2006, 12:38 Uhr
~RedStar
Gast


Was du schriebst, Tommix -


C++:
const char table::LINEON = 0x1;


- funktioniert aber eben nicht:

9 Ftmpcpp\tableFoundationClass\table.cpp `const char table::LINEON' is not a static member of `class table'


Ich werde mal noch etwas im Netz schauen, /wie/ ich Konstanten in Klassen deklarieren muss. (Hab nämlich gerade gemerkt, dass ich gestern - ohne es zu merken - alle meine Konstanten global gemacht habe, und dann muss es ja funktionieren )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.03.2006, 12:50 Uhr
Tommix



Wenn Du die Konstanten global gemacht hast, geht es natürlich nicht mehr.


C++:

// header
class table
{
public:
    static const char LINEON;
};

// implantation:

const char table::LINEON = 0x1;



sollte IMHO schon gehen.

Eine Alternative wäre übrigens

C++:
class table
{
public:
   enum {LINEON = 0x1, DOUBLELINE = 0x10 /*usw.*/};
};


.
- Tommix

Dieser Post wurde am 02.03.2006 um 12:51 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: