1
votes

Disclaimer: I'm new to programming in c++, I've read through dozens of forums, and can't find an answer to my specific question.

I've included the header and definition files for a Point class below and a main function that calls an overloaded ostream to print the Point. I can't find the correct syntax for the definition for the non member overloaded operator<<. If I have it the way it's posted, I get error message:

undefined reference to `Clustering::operator<<(std::ostream&, Clustering::Point const&)

If I add Clustering:: before the operator<< I get error message:

std::ostream& Clustering::operator<<(std::ostream&, const Clustering::Point&)' should have been declared inside 'Clustering' std::ostream &Clustering::operator<<(std::ostream &os, const ::Clustering::Point &point)

How is this code supposed to be written?

Point.h file:

#ifndef CLUSTERING_POINT_H
#define CLUSTERING_POINT_H

#include <iostream>

namespace Clustering {

    class Point {
        int m_dim;        // number of dimensions of the point
        double *m_values; // values of the point's dimensions

    public:
        Point(int);

        friend std::ostream &operator<<(std::ostream &, const Point &);
    };
}

#endif //CLUSTERING_POINT_H

Point.cpp file:

#include "Point.h"

//Constructor
Clustering::Point::Point(int i)
{
    m_dim = i;
    m_values[i] = {0};
}

std::ostream &operator<<(std::ostream &os, const Clustering::Point &point) {
    os << "Test print";
    return os;
}

Main.cpp:

#include <iostream>
#include "Point.h"

using namespace std;
using namespace Clustering;`

int main() {

    Point p1(5);
    cout << p1;
    return 0;
}
1
m_values[i] = {0}; This is an invalid pointer. - Neil Kirk

1 Answers

2
votes

You need to put your std::ostream &operator<< in Clustering namespace in Point.cpp

namespace Clustering {

    std::ostream &operator<<(std::ostream &os, const Clustering::Point &point)
    { 
       // ... 
    }

}