-1

I wanted to try to overload "<<" operator for an output stream and a custom class Article.

my.h

#include <iostream>
using namespace std;
class Article {
    string body;
    string header;
    string author;
public:
    Article();
    void addHeader(const string&);
    void addBody(const string&);
    string getHeader();
    string getBody();
};

my.cpp

string Article::getHeader() {
    return header;
}


void Article::addBody(const string& body) {
    this->body = body;
}
void Article::addHeader(const string& header) {
    this->header = header;
}

ostream& operator<<(ostream& os, Article& article) {
    return os << article.getHeader() << "\n\n" << article.getBody();
}

main.cpp

#include <iostream>
#include <string>
#include "my.h"
void main() {
    char bye;
    Article article = Article();
    article.addBody("This is my article! thank you!");
    article.addHeader("Header");
    cout << article.getHeader() << "\n";
    cout << article.getBody() << "\n";
    cout << article;
    cin >> bye;
}

This code doesn't compile. VS 2013 says:

binary '<<' : no operator found which takes a right-hand operand of type 'Article' (or there is no acceptable conversion)

If I remove the last line, it compiles successfully and the output of getHeader() and getBody() is as expected. They both return strings so it should be a piece of cake.

This problem seems very simple, however, as simple as it is I can't figure out what is happenning.

webdive
  • 77
  • 8

1 Answers1

3

Now that you have posted real code the answer is obvious.

You define your operator << in my.cpp, but you don't declare it in my.h, so when compiling main.cpp the compiler has no way of knowing it exists.

Add a declaration of the function to your header.

Alan Stokes
  • 18,567
  • 3
  • 42
  • 63