Madison Brown
Madison Brown

Reputation: 331

How to share protected members between C++ template classes?

Consider the following example:

class _ref
{
public:
    _ref() {}
    _ref(const _ref& that) {}
    virtual ~_ref() = 0;
};
_ref::~_ref() {}

template <typename T>
class ref : public _ref
{
protected:
    ref(const _ref& that) {}

public:
    ref() {}
    ref(const ref<T>& that) {}
    virtual ~ref() {}

    template <typename U>
    ref<U> tryCast()
    {
        bool valid;
        //perform some check to make sure the conversion is valid

        if (valid)
            return ref<U>(*this); //ref<T> cannot access protected constructor declared in class ref<U>
        else
            return ref<U>();
    }
};

I would like all types of 'ref' objects to be able to access each other's protected constructors. Is there any way to accomplish this?

Upvotes: 7

Views: 880

Answers (1)

Piotr Skotnicki
Piotr Skotnicki

Reputation: 48487

template <typename T>
class ref : public _ref
{
    template <typename U>
    friend class ref;
    //...

DEMO

Upvotes: 12

Related Questions