在特定命名空间中创建库时,为该命名空间中的类提供重载操作符通常很方便.看来(至少用g ++),重载的运算符可以在库的命名空间中实现:
namespace Lib {
class A {
};
A operator+(const A&, const A&);
} // namespace Lib
Run Code Online (Sandbox Code Playgroud)
或全局命名空间
namespace Lib {
class A {
};
} // namespace Lib
Lib::A operator+(const Lib::A&, const Lib::A&);
Run Code Online (Sandbox Code Playgroud)
从我的测试来看,它们似乎都运行良好.这两个选项之间是否存在实际差异?两种方法都更好吗?
我有一个常规类(不是模板,也就是说)与私人朋友运营商<<
它的声明是:
std::ostream& operator<<(std::ostream& out, const Position& position);
Run Code Online (Sandbox Code Playgroud)
在cpp文件中,它的定义是:
std::ostream& operator<<(std::ostream& out, const Position& position)
{
out << position.getXPoint() << "," << position.getYPoint();
return out;
}
Run Code Online (Sandbox Code Playgroud)
它正在编译然后链接到使用它的main函数,但是当我使用它时,我得到一个未定义的引用...
但是,当我将定义添加到主cpp文件的顶部并删除友元声明时,它工作正常...
继承人我在主要功能中如何使用它
std::cout << node->getPosition() << std::endl;
Run Code Online (Sandbox Code Playgroud)
不多也不少......
继承人错误
/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 …Run Code Online (Sandbox Code Playgroud)