这里是我的类声明:朋友类不能访问私人数据
template <class T>
class Sptr {
template<typename U> friend class Sptr;
template <typename T1, typename T2>
friend bool operator==(const Sptr<T1> &a, const Sptr<T2> &b);
template <typename U>
friend Sptr<T> static_pointer_cast(const Sptr<U> &sp);
private:
RC* ref; //reference counter
T* obj;//pointer to current obj
std::function<void()> destroyData;
bool ok_;
public:
Sptr();
~Sptr();
template <typename U>
Sptr(U *);
Sptr(const Sptr &);
template <typename U>
Sptr(const Sptr<U> &);
template <typename U>
Sptr<T> &operator=(const Sptr<U> &);
Sptr<T> &operator=(const Sptr<T> &);
void reset();
T* operator->() const
{return obj;};
T& operator*() const
{return *obj;};
T* get() const
{return obj;};
explicit operator bool() const {
return ok_;
}
};
下面是代码多数民众赞成在抱怨接入问题
template <typename T, typename U>
Sptr<T> static_pointer_cast(const Sptr<U> &sp) {
//do something
Sptr<U> answer;
answer.obj = sp.obj;
answer.ref = sp.ref;
answer.destroyData = sp.destroyData;
answer.ok_ = sp.ok_;
return answer;
}
,当我编译下面的代码:
Sptr<Derived> sp(new Derived);
Sptr<Base1> sp2(sp);
// Sptr<Derived> sp3(sp2); // Should give a syntax error.
Sptr<Derived> sp3(static_pointer_cast<Derived>(sp2));
// Sptr<Derived> sp4(dynamic_pointer_cast<Derived>(sp2)); // Should give syntax error about polymorphism.
我已经使它成为朋友功能。为什么无法访问变量以及如何纠正?
两个小问题与你的问题没有任何关系:你不应该在函数实现后加分号。你可以使'operator =='成为一个成员,因此它不必是朋友。 – leemes
它要么是当你写你的问题或在您的代码中的错误复制粘贴错误:在'执行static_pointer_cast'你实际上是复制一个'特征码'到'特征码'然后将其转换为'特征码'在return语句中。你想分配一个'Sptr '然后复制每个字段吗? –
leemes
'template friend class Sptr;'!='template Sptr static_pointer_cast(const Sptr &sp)' –
kfsone