Linker Fehler

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Linker Fehler

    Hallo,

    ich habe ein Problem beim linken der folgenden 3 Dateien. Ich nehme an das es mit Mehrfahr-Inkludierung zu tun hat.

    Hauptprogramm:

    Quellcode

    1. // Uebung5.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    2. #include
    3. #include "Vektor.h"
    4. #include "Matrix.h"
    5. void init(Matrix *m){
    6. int arr[] = {1,2,3,4,5};
    7. Vektor *v = new Vektor(arr,5);
    8. for(int x=0; x < m->num_rows(); x++){
    9. for(int y=0; y < m->num_cols(); y++){
    10. ((*m)[x])[y] = v;
    11. }
    12. }
    13. }
    14. void print(Matrix *m){
    15. std::cout << *m;
    16. }
    17. int main(void){
    18. std::cout << "Hallo" << std::endl;
    19. Matrix *m = new Matrix(2,3);
    20. init(m);
    21. return 0;
    22. }
    Alles anzeigen


    Klasse Matrix:

    Quellcode

    1. #ifndef FIBS_S
    2. #define FIBS_S
    3. #include
    4. templateclass Vektor;
    5. template
    6. class Matrix {
    7. public:
    8. Matrix(int n, int m); // Konstruktor für n x m Elemente
    9. ~Matrix(); // Destruktor
    10. int num_rows() const; // Anzahl Zeilen
    11. int num_cols() const; // Anzahl Spalten
    12. Vektor* operator[](int i);
    13. friend std::ostream& operator<<(std::ostream& out, const Matrix& m);
    14. private:
    15. Vektor** p; // Array von Zeigern auf Objekte Vektor
    16. int rows;
    17. int columns;
    18. };
    19. template
    20. Matrix::Matrix(int n, int m){
    21. this->p = new Vektor*[n];
    22. for(int i=0; ip[i] = new Vektor(m);
    23. }
    24. this->rows = n;
    25. this->columns = m;
    26. };
    27. // Destruktor
    28. template
    29. Matrix::~Matrix(){
    30. delete [] p;
    31. } ;
    32. // Anzahl Zeilen
    33. template
    34. int Matrix::num_rows() const{
    35. return this->rows;
    36. };
    37. template
    38. int Matrix::num_cols() const{
    39. return this->columns;
    40. };
    41. template
    42. Vektor* Matrix::operator[](int i){
    43. //assert (i >= 0 && i < size );
    44. return p[i];
    45. };
    46. template
    47. std::ostream& operator<<(std::ostream& out, const Matrix& m){
    48. for(int x=0; x< m.num_rows(); x++){
    49. out << m[x];
    50. }
    51. out << endl;
    52. return out;
    53. };
    54. #endif
    Alles anzeigen


    Klasse Vektor:

    Quellcode

    1. #ifndef FIBS_W
    2. #define FIBS_W
    3. #include
    4. template
    5. class Vektor {
    6. public:
    7. explicit Vektor(int n); // Konstruktor für n Elemente
    8. Vektor(const Vektor& v); // copy Vector
    9. Vektor(const T a[], int n); // copy an array
    10. ~Vektor(); // Destruktor
    11. T& element(int i); // Zugriff auf i-tes Element
    12. int num_elem() const; // Anzahl Elemente
    13. T& operator[](int i);
    14. Vektor& operator=(const Vektor* v);
    15. friend std::ostream& operator<<(std::ostream& out, const Vektor& v);
    16. private:
    17. T* p;
    18. int size;
    19. };
    20. template
    21. Vektor::Vektor(const T a[], int n)
    22. {
    23. //assert(n > 0);
    24. size = n;
    25. p = new T[size];
    26. for (int i = 0; i < size; ++i)
    27. {
    28. p[i] = a[i];
    29. }
    30. };
    31. template
    32. Vektor::Vektor(int n): size(n){
    33. //assert(n > 0);
    34. p = new T[size];
    35. };
    36. template
    37. Vektor::Vektor(const Vektor &v){
    38. p = new T[v.size];
    39. for(int i = 0; i < size; i++){
    40. p[i] = v.element(i);
    41. }
    42. }
    43. template
    44. Vektor::~Vektor(void){
    45. delete [] p;
    46. };
    47. template
    48. T& Vektor::element(int i){
    49. return this->p[i];
    50. };
    51. template
    52. int Vektor::num_elem() const{
    53. return this->size;
    54. };
    55. template
    56. T& Vektor::operator[](int i){
    57. //assert (i >= 0 && i < size );
    58. return (p[i]);
    59. };
    60. template
    61. Vektor& Vektor::operator=(const Vektor* v)
    62. {
    63. //assert(v.size == size);
    64. for (int i = 0; i < size; ++i) {
    65. p[i] = v->p[i];
    66. }
    67. return *this;
    68. };
    69. template
    70. std::ostream& operator<<(std::ostream& out, const Vektor& v){
    71. for(int x=0; x< v.size; x++){
    72. out << v[x];
    73. }
    74. out << std::
    75. endl;
    76. return out;
    77. };
    78. #endif
    Alles anzeigen


    PS: Wenn mir noch einer verraten könnte wie man mit der Verwendung von tamplates die Implementierung des Header (hier Matrix.h und Vektor.h) auch in eine .cpp schreiben kann, denn ich habe jetzt nur den Weg gefunden die Implementierung in die Header-Datei zu schreiben -> finde ich jetzt nicht so schön

    Ich verwende Ms-Visual Studio</T></class></T></T></class></T></class></T></class></T></class></T></n;></T></T></class></T></T></T></class></class></iostream>
  • RE: Linker Fehler

    Sw00sh! schrieb:


    PS: Wenn mir noch einer verraten könnte wie man mit der Verwendung von tamplates die Implementierung des Header (hier Matrix.h und Vektor.h) auch in eine .cpp schreiben kann, denn ich habe jetzt nur den Weg gefunden die Implementierung in die Header-Datei zu schreiben -> finde ich jetzt nicht so schön


    Da gibt's eine Lösung: Verwende einen Compiler, der export unterstützt (comeaucomputing.com/)

    Um bei der Fehlersuche zu helfen wäre eine genaue Fehlermeldung freundlich
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Das ist die Fehlermeldung.
    Danke schon mal für die Antwort :)

    Quellcode

    1. Uebung5.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""class std::basic_ostream > & __cdecl operator<<(class std::basic_ostream > &,class Matrix const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Matrix@H@@@Z)" in Funktion ""void __cdecl print(class Matrix *)" (?print@@YAXPAV?$Matrix@H@@@Z)".
    2. D:\Eigene Dateien\VISUAL STUDIO 2005\PROJECTS\Uebung5\Debug\Uebung5.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    3. Das Buildprotokoll wurde unter "file://d:\Eigene Dateien\VISUAL STUDIO 2005\PROJECTS\Uebung5\Uebung5\Debug\BuildLog.htm" gespeichert.
    4. Uebung5 - 2 Fehler, 0 Warnung(en)
    </int></int></char></char,struct></char></char,struct>
  • Jetzt linkt er zwar, schmiert aber ab.
    Das darfst du dir selber anschauen :) - dürfte ein Problem bei der Initialisierung sein (2x3 vs. 5)
    Hauptproblem war die "friend" Deklaration.
    Sollte eher vermieden werden.
    Habe die Implementierung der globalen Funktionen in die .cpp Datei verschoben, um den duplicated symbols error in der Zukunft zu vermeiden.
    Außerdem habe ich in der eigentlichen Print-Methode (.cpp , line 20) den korrekten Aufruf verwendet.
    hth
    Dateien
    • Uebung5_v2.zip

      (1,67 kB, 210 mal heruntergeladen, zuletzt: )
    There's no place like 127.0.0.1