在这种情况下,允许访问类模板的另一个实例的私有成员的好方法是什么?

时间:2019-09-12 14:29:54

标签: c++ c++11

我正在研究多边形类:

// A polygon is multiple (possibly closed) polycurves.
template <typename T, typename P = _point<T,2>>
struct _polygon {
    using point  = P;

    // default constructor
    _polygon() {
        offs_.push_back(0);
    }

    // build polygon from another type
    template <typename U>
    _polygon(const _polygon<U> &poly) {
        pnts_.reserve(poly.pnts_.size());
        offs_ = poly.offs_;
        for (const auto& pnt : poly.pnts_) {
            pnts_.push_back(point(pnt));
        }
    }

private:
    vector<point> pnts_; // list of points
    vector<int>   offs_; // offsets of start of polychains
};

问题出在转换构造函数中。访问其他_polygon类型的成员时出现错误消息:

  

polygon.h:376:28:错误:‘std :: vector,   std :: allocator>>   sk :: _ new_polygon :: pnts_在此上下文中是私有的            pnts_.reserve(poly.pnts_.size());

很显然,一个类模板C的实例不是朋友/对另一个实例C没有可见性,这对我来说有点令人惊讶。在这种情况下,如何访问另一个多边形的内部进行转换?

1 个答案:

答案 0 :(得分:3)

只需将其他模板声明为朋友:

template <typename T, typename P>
friend class _polygon;

我很聪明,用下划线开头的名字来命名您的班级。