プライベートフレンド演算子を使用した通常のクラス(つまり、テンプレートではない)があります<<
宣言は次のとおりです。
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ファイルの先頭に定義を追加してfriend宣言を削除すると、正常に機能します...
これが私の主な機能での使用方法です
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
フレンド宣言を削除した後、次のようなエラーメッセージが表示されます。
'std :: ostream {aka std ::basic_ostream}'lvalueを'std:: basic_ostream &&'</p>にバインドできません
std::coutステートメントと同じ行で発生しています。
だから、どうしたの...
前もって感謝します