Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » instantiated from here

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
30.08.2005, 12:53 Uhr
~Gast
Gast


Hallo!

Ich bekomme beim übersetzen meines Programmes immer folgende Meldung:

"instantiated from here" im Zusammenhang mit Templates.

Nur: ich hab keine Ahnung, was das heissen soll, bzw. was jetzt falsch ist.

Der Compiler ist MinGW.

Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.08.2005, 13:09 Uhr
Pablo
Supertux
(Operator)


vielleicht solltest du ein bisschen Code zeigen. Oder bekommst du es immer?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.08.2005, 13:35 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


das heißt nur das der vorangegangene fehler an dieser stelle aufgetreten ist. Ohne genauere Fehlerbeschreibung davor kommt der Fehler normalerweise nie vor.

z.b

"missing ; at ..."
"instantiated from here: ..."

so kommen die denke ich vor.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.08.2005, 13:39 Uhr
~Gast
Gast


Ich bekomme nur das als Fehler...

funktioniert jetzt aber schon (keine Ahnung, warum...)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.08.2005, 13:43 Uhr
~Gast
Gast


Ich probier derzeit eine Baum-Struktur zu erstellen...

Bis jetzt hab ich das:

Node.h:

C++:
#ifndef _NODE_H_
#define _NODE_H_

#include <vector>

namespace engine
{

template<class T>
class Node
{
private:
    T Value;
    std::vector<Node* > SubNodes;
public:
    void setValue(T newValue);
    T getValue();
    Node<T> operator [](int index);
    void addNode(Node NodeToAdd);

    Node();
    virtual ~Node();
};

//implementation

template<class T>
void Node<T>::setValue(T newValue)
{
    Value = newValue;
}

template<class T>
T Node<T>::getValue()
{
    return Value;
}

template<class T>
Node<T> Node<T>::operator[] (int index)
{
    return *SubNodes[index];
}

template<class T>
void Node<T>::addNode(Node NodeToAdd)
{
    SubNodes.push_back(&NodeToAdd);
}

template<class T>
Node<T>::Node()
{
}

template<class T>
Node<T>::~Node()
{
}

};

#endif //_NODE_H_



und main.cpp (zum testen)

C++:
#include <iostream>
#include <vector>
#include "Node.h"


using namespace engine;
using namespace std;

int main() {
    int a = 100;
    Node<int> n1, n2;
    n1.addNode(n2);
    n1.setValue(123);
    n1[0].setValue(456);
    cout << n1.getValue() << endl;

    cout << "Index: " << a << endl;
    system("Pause");
    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.08.2005, 13:44 Uhr
~Gast
Gast


Der Fehler trat bei n1.addNode(n2) in main.cpp auf...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.08.2005, 13:56 Uhr
virtual
Sexiest Bit alive
(Operator)


Also, reinen Compilerfehler kann ich hier erstmal nicht feststellen..
Aber der Code ist dennoch äußerst Problematisch:

C++:
class Node
{
private:
    T Value;
    std::vector<Node* > SubNodes;


Diese Deklaration bedeutet, daß du den Vector nachher selbst freigeben mußt, denn Node* Objekte haben keinen Destruktor, den haben nur Node Objekte. Das wäre erstmal nicht weiter tragisch: da du kein remNode hast, bräuchtest Du nur den Destruktor von Node anzupassen. Richtig ärgerlich wird es aber hier:


C++:
template<class T>
void Node<T>::addNode(Node NodeToAdd)
{
    SubNodes.push_back(&NodeToAdd);
}


Hier tust du einen Pointer auf eine lockale Variable (nämlich NodeToAdd) in den Vector. Das wird mit an sicherheit grenzender Wahrscheinlichkeit zum Absturz führen

Was ich halt generell aussetzen würde: du arbeistet mit vector<Node*>, weil Du wohl hoffst, ein wenig Performance zu gewinnen, um nur Pointer zu kopieren. Das wird aber konterkariert, indem Du niemals ernsthaft mit Referenzen arbeitst, sondern Nodeobjekte bei der parameterübergabe munter hin+her kopierst.

Du wirst mit diesem Code keine Freude haben, auch wenn er kompiliert.
Tu dir im ersten Schritt den Gefallen, die Sache umschreiben in:

C++:
template<class T>
class Node
{
private:
    T Value;
    std::vector<Node> SubNodes;
public:
    void setValue(T newValue);
    T getValue();
    Node<T> operator [](int index);
    void addNode(Node NodeToAdd);

    Node();
    virtual ~Node();
};

//implementation

template<class T>
void Node<T>::setValue(const T& newValue)
{
    Value = newValue;
}

template<class T>
const T& Node<T>::getValue() const
{
    return Value;
}

template<class T>
T& Node<T>::getValue()
{
    return Value;
}

template<class T>
const Node<T>& Node<T>::operator[] (int index) const
{
    return *SubNodes[index];
}

template<class T>
Node<T>& Node<T>::operator[] (int index)
{
    return *SubNodes[index];
}

template<class T>
void Node<T>::addNode(const Node& NodeToAdd)
{
    SubNodes.push_back(NodeToAdd);
}
};


--
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
30.08.2005, 14:33 Uhr
~Gast
Gast


Ich hab das jetzt übernommen und viel Compiler-Fehler:


Code:

**** Full rebuild of configuration Debug for project node ****

make -k clean all
rm -rf     main.o       main.d   node.exe
Building file: ../main.cpp
g++ -O0 -g3 -Wall -c -fmessage-length=0 -omain.o ../main.cpp
In file included from ../main.cpp:3:
../Node.h:29: error: prototype for `void engine::Node<T>::setValue(const T&)' does not match any in class `engine::Node<T>'
../Node.h:16: error: candidate is: void engine::Node<T>::setValue(T)
../Node.h:29: error: template definition of non-template `void engine::Node<T>::setValue(const T&)'
../Node.h:35: error: prototype for `const T& engine::Node<T>::getValue() const' does not match any in class `engine::Node<T>'
../Node.h:17: error: candidate is: T engine::Node<T>::getValue()
../Node.h:35: error: template definition of non-template `const T& engine::Node<T>::getValue() const'
../Node.h:41: error: prototype for `T& engine::Node<T>::getValue()' does not match any in class `engine::Node<T>'
../Node.h:35: error: candidates are: const T& engine::Node<T>::getValue() const
../Node.h:17: error:                 T engine::Node<T>::getValue()
../Node.h:41: error: template definition of non-template `T& engine::Node<T>::getValue()'
../Node.h:47: error: prototype for `const engine::Node<T>& engine::Node<T>::operator[](int) const' does not match any in class `engine::Node<T>'
../Node.h:18: error: candidate is: engine::Node<T> engine::Node<T>::operator[](int)
../Node.h:47: error: template definition of non-template `const engine::Node<T>& engine::Node<T>::operator[](int) const'
../Node.h:53: error: prototype for `engine::Node<T>& engine::Node<T>::operator[](int)' does not match any in class `engine::Node<T>'
../Node.h:47: error: candidates are: const engine::Node<T>& engine::Node<T>::operator[](int) const
../Node.h:18: error:                 engine::Node<T> engine::Node<T>::operator[](int)
../Node.h:53: error: template definition of non-template `engine::Node<T>& engine::Node<T>::operator[](int)'
../Node.h:59: error: prototype for `void engine::Node<T>::addNode(const engine::Node<T>&)' does not match any in class `engine::Node<T>'
../Node.h:19: error: candidate is: void engine::Node<T>::addNode(engine::Node<T>)
../Node.h:59: error: template definition of non-template `void engine::Node<T>::addNode(const engine::Node<T>&)'
make: *** [main.o] Error 1
make: Target `all' not remade because of errors.
Build complete for project node

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.08.2005, 14:46 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich habe vergessen, die Deklarationen anzupassen:

C++:
template<class T>
class Node
{
private:
    T Value;
    std::vector<Node> SubNodes;
public:
    void setValue(const T& newValue);
    const T& getValue() const;
    T& getValue();
    Node<T>& operator [](int index);
    const Node<T>& operator [](int index) const;
    void addNode(const Node& NodeToAdd);

    Node() {};
    virtual ~Node() { };
};


--
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
009
30.08.2005, 14:51 Uhr
~Gast
Gast


Danke!
 
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: