неопределенная ссылка на оператор<<

У меня есть обычный класс (то есть не шаблон) с приватным оператором друга<<

его объявление:

std::ostream& operator<<(std::ostream& out, const Position& position);

в файле cpp его определение:

std::ostream& operator<<(std::ostream& out, const Position& position)
{
  out << position.getXPoint() << "," << position.getYPoint();
  return out;
}

он в настоящее время компилируется, затем связывается с основной функцией, которая ее использует, однако, когда я ее использую, я получаю неопределенную ссылку...

однако, когда я добавляю определение в начало основного файла cpp и удаляю объявление друга, все работает нормально ...

вот как я использую его в своей основной функции

std::cout << node->getPosition() << std::endl;

ни больше, ни меньше...

вот ошибка компоновщика

/home/luke/Desktop/pathfinder/parse_world.cpp:34 : неопределенная ссылка на `pathfinder::operator<<(std::ostream&, pathfinder::Position const&)'

и вот заголовок класса...

#ifndef PATHFINDER_H
#define PATHFINDER_H
#include <ostream>
#include <istream>
#include <list>
#include <vector>
#include <stdexcept>
#include <cstring>
namespace pathfinder
{
class Node;
typedef unsigned int GCost;
typedef std::vector<std::vector<Node*> > World;
typedef std::vector<Node*> WorldRow;
class Position
{
public:
    typedef unsigned int point_type;
private:
    point_type* xPoint_;
    point_type* yPoint_;
    friend std::ostream& operator<<(std::ostream& out, const Position& position);
public:
    Position(const point_type& xPoint = 0, const point_type& yPoint = 0);
    Position(const Position& position);
    Position(Position&& position);
    ~Position();

    Position& operator=(const Position& position);
    Position& operator=(Position&& position);

    point_type getXPoint() const;
    point_type getYPoint() const;

    void setXPoint(const point_type& xPoint);
    void setYPoint(const point_type& yPoint);
};
class Node
{
private:
    bool* isPassable_;
    bool* isStartingNode_;
    bool* isTargetNode_;
    Position* position_;
    GCost* additionalGCost_;
    Node* parent_;
public:
    Node(const bool& isPassable = true, const bool& isStartingNode = false, const bool& isTargetNode = false, const Position& position = Position(0,0), const GCost& additionalGCost = 0, Node* parent = nullptr);
    Node(const Node& node);
    Node(Node&& node);
    ~Node();

    Node& operator=(const Node& node);
    Node& operator=(Node&& node);

    bool isPassable() const;
    bool isStartingNode() const;
    bool isTargetNode() const;
    Position getPosition() const;
    GCost getAdditionalGCost() const;
    Node* getParent() const;

    void setAsPassable(const bool& isPassable);
    void setAsStartingNode(const bool& isStartingNode);
    void setAsTargetNode(const bool& isTargetNode);
    void setPosition(const Position& position);
    void setAdditionalGCost(const GCost& additionalGCost);
    void setParent(Node* parent);
};
class WorldHelper
{
public:
    static World fromStream(std::istream& input);
    static void syncPositions(World& world);
    static void uninitializeWorld(World& world);
    static Node* findStartingNode(const World& world);
    static Node* findTargetNode(const World& world);
};
class Pathfinder
{
public:
    virtual std::list<Node*> operator()(World& world) const = 0;
};
};
#endif //PATHFINDER_H

теперь, после удаления объявления друга, я получаю сообщения об ошибках, например :

невозможно связать lvalue 'std::ostream {aka std::basic_ostream}' с 'std::basic_ostream&&'

это происходит в той же строке, что и оператор std::cout...

Итак, в чем дело...

заранее спасибо

11
задан 23 May 2012 в 02:25
поделиться