Linker error

Ok I have all of my code compiling, but I cannot find the linker error that is preventing it from running. Please help. Here is the code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// poddriver.cpp

//Adapted from Roger Priebe
//CS2308 11/17/08

#include <stdlib.h>
#include <iostream>
#include "BobCatPod.h"
#include "song.h"

using namespace std;

int main()
{
    bool operator==(const Song& lhs, const Song& rhs);
    bool operator<(const Song& lhs, const Song& rhs);

    
    Song s1("Frank Sinatra", "My way", 14);
    Song s2("Beatles", "Act Naturally", 5);
    Song s3;
    
    BobCatPod p(256);
    BobCatPod q(512);
    BobCatPod r(25);


    cout << "pod p" << endl << p << endl;
    cout << "pod q, size 512 exceeds max, should be reset to 256 " << endl
         << q << endl;
    cout << "pod r, size should be 25 " << endl << r << endl;


    cout << "Song 1" << s1 << endl;
    cout << "Song 2" << s2 << endl;
    cout << "Song 3" << s3 << endl;

    s3.setArtist("Buck Owens");
    s3.setTitle("Act Naturally");
    s3.setSize(20);

    cout << "Song 3 updated " << s3 << endl;
    cout << "Artist 1 (Frank Sinatra)  " << s1.getArtist() << endl;
    cout << "Title 2 (Act Naturally)  " << s2.getTitle() << endl;
//    s1.setSize(7);
//    cout << "Size 1 (7) " << s1.getSize() << endl;

//test relational operators

    if (s1 < s3 ) cout << endl << "s1 < s3" << endl;
      else cout << endl << "s1 >= s3" << endl;
    if (s1 == s2) cout << endl << "s1 == s2" << endl;
      else cout << endl << "s1 != s2"  << endl;
    
// test addnode
    cout << "add song 1, size 14 " << r.addSong(s1) << endl;  
    cout << "   memory left = "  << r.getRemainingMemory() <<endl;
    cout << "add song 2, size 5 " << r.addSong(s2)<< endl; 
    cout << "   memory left = "  << r.getRemainingMemory() << endl;
    cout << "add song 3, size 20 should fail " << r.addSong(s3) <<endl;
    cout << "   memory left = "  << r.getRemainingMemory() << endl;
  
    s3.setSize(2);
    cout << "Size 3 (2) " << s3.getSize() << endl;
    cout << "add song 3, size 2 should succeed " << r.addSong(s3) 
         << "   memory left = "  << r.getRemainingMemory() << endl;


// test output
    cout << r << endl;

//test delete

    r.removeSong(s1);
    cout << r << endl;
    r.removeSong(s3);
    cout << r << endl;

    cout << "Total Memory = "<< r.getTotalMemory() << endl;





    return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//song.h
#ifndef SONG_H
#define SONG_H
#include <stdlib.h>
#include <iostream>
#include <ostream>
#include <string>
//#include "BobCatPod.h"
using namespace std;
std::ostream

class Song
{
  
   public:
      Song();
      Song(string , string , int ); // constructor
      void setSize(int s);
      int getSize(); // access or
      void setTitle (string t);
       string getTitle();
      void setArtist (string a);
       string getArtist();
      void addSong (int);
      friend ostream& operator<<(ostream & os, const Song & s);
      
   private:
      string title;    //dynamic allocation
      string artist;
      int size;
};
#endif 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// file song.cpp
#include "song.h"
#include "BobCatPod.h"

 ostream & operator << ( ostream & os, Song & s)
 {
      os << s.getTitle();
      os  << s.getArtist();
      os << s.getSize();
      return os;
 }
//constructor
Song::Song ()
{
    title=" ";
    artist=" ";
    size = 0;
}
Song::Song(string a, string t, int s) // constructor
{
    size = s;
    title = t;
    
    artist = a ;
    
}
//accessor for name
string Song :: getTitle()
{
      return title;
}
//mutator
void Song :: setTitle (string t)
{
     title = t;
     
}
string Song :: getArtist()
{
      return artist;
}
//mutator
void Song :: setArtist (string a)
{
     artist = a;
     
}
void Song::setSize(int s)
{
    size = s;
}
int Song::getSize()
{
    return size;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//BobCatPod.h

//Specification files for the SongList class

#ifndef BOBCATPOD_H
#define BOBCATPOD_H
#include "song.h"



class BobCatPod
{
      
      private:
      struct SongNode
      {
             Song s;                  //value in this node
             SongNode *next;
      
                         
      };
      
      SongNode *head;
      static const int MAX_MEMORY = 256;
      
      
      public:
             int totalMemory;
             int remainingMemory;
             
             
             //Constructor
             BobCatPod();

                 
             //Linked list operations
             BobCatPod(int i);
             bool isFull ( ) const;
             int addSong (Song s);
             int removeSong (Song s);
             void showSongList ();
             int getTotalMemory();
             int getRemainingMemory();
             friend ostream & operator<<(ostream & os, BobCatPod & i);
             
             
             //Destructor
             ~BobCatPod();

};
#endif 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//BobCatPod.cpp
//#include "song.h"
#include "BobCatPod.h"

ostream & operator << ( ostream & os, BobCatPod & i)
 {
      os << i.getTotalMemory();
      os  << i.getRemainingMemory();
      return os;
 }


BobCatPod::BobCatPod()
{
     head = NULL;
     
}

bool BobCatPod::isFull ( ) const
{
     if (totalMemory > MAX_MEMORY)
     {
      
                return true;
     }
}

BobCatPod::BobCatPod(int i)  
{
    
    if( i <= MAX_MEMORY)
        remainingMemory = i;    
    else
        remainingMemory = MAX_MEMORY;
}

int BobCatPod::addSong(Song t)
{
      if (isFull ())
     {
                return 0;
     }
     SongNode *newSong = new SongNode;     //a new node
     
    
     
     // Allocate a new node and stor num there.
     
     newSong->s = t; 
     head = newSong;
     newSong->next = NULL;
     totalMemory++;
    
     return 1;
}


int BobCatPod::removeSong( Song t )
{
     if (isFull ())
     {
                totalMemory--;
                return 1;
     }
     else     
     return 1;
}
 
void BobCatPod::showSongList( )
{
     SongNode *n;
     cout<<endl;
 
     for( n = head ; n != NULL ; n = n->next )
        cout<<endl<<n->s;
}

int BobCatPod::getTotalMemory()
{
    Song t;
    totalMemory = t.getSize();
    return totalMemory;
}

int BobCatPod::getRemainingMemory()
{
    
    remainingMemory = MAX_MEMORY - totalMemory;
    return remainingMemory;
}
You're not actually expecting us to read all that and figure out what the linker error was, are you?
well I thought you could maybe help me out. I thought I should post all of the code for you all to see. I don't expect you to go through every line of it, I just thought someone could give me an idea of where to look or they may know themselves where to look to find the problem. I was not being rude and I just asked a question. I am sorry if you thought it was not an appropriate question, but I was not sure how much of my code one would need to see and I wanted to show that I had done most of the work myself. If you needed more clarification you could have just said so instead of talking down to me. I thought this was forum was to help beginners. thanks
I think that posting the error message could help...
ok the error message states
[Linker error] undefined reference to 'operator<<(std::ostream&, song const&)'
I think that the error is probably in my song.h file but I am not sure. would it be better to just post that file? Thanks
I can't see the definitions of
ostream& Song::operator<<(ostream & os, const Song & s);
nor
ostream & Song::operator<<(ostream & os, BobCatPod & i);
Last edited on
The definition of ostream& Song::operator<<(ostream & os const Song & s);
is
1
2
3
4
5
6
7
ostream & operator << ( ostream & os, Song & s)
 {
      os << s.getTitle();
      os  << s.getArtist();
      os << s.getSize();
      return os;
 }
Add a const specifier to the implementation
1
2
3
4
5
6
7
ostream & operator << ( ostream & os, const Song & s)
 {
      os << s.getTitle();
      os  << s.getArtist();
      os << s.getSize();
      return os;
 }
Last edited on
Also add the namespace:
ostream & Song::operator << ( ostream & os, const Song & s)
Last edited on
Topic archived. No new replies allowed.