我想要编译以下内容,但它没有:
template <typename T>
struct Odp
{
public:
operator*() const
{
return m_p;
}
T* operator->() const
{
return m_p;
}
T** operator&()
{
return &m_p;
}
private:
T* m_p;
};
struct Ftw : public Odp<int>
{
bool operator==(const Ftw& rhs)
{
return m_p == rhs.m_p; // C2248 cannot access private member
}
};
有没有办法让这项工作?我无法修改Odp
。
答案 0 :(得分:4)
Odp
重载operator*
以返回m_p
。您可以在*this
和rhs
上调用运算符:
struct Ftw : public Odp<int>
{
bool operator==(const Ftw& rhs) const
{
return **this == *rhs;
}
};
operator*
重载有点不寻常:它应该返回*m_p
,因为operator->
返回m_p
(这会导致你的类具有一致的指针 - 类似语义)。如果您这样做,则必须执行以下操作来进行比较:
return &**this == &*rhs; // or explicitly as:
return &this->operator*() == &rhs.operator*();
这有点乱,如果&
的一元T
超载,它就不一定有效(但是,你真的,真的不应该去做...)。您还可以通过显式调用operator->
来获取指针,这可能是更好的选择:
return this->operator->() == rhs.operator->();
真正的问题是,“这是Odp
是什么,为什么要使用它,为什么不能修改它?”
在不相关的注释中,您的operator==
应该作为const成员函数实现,或者最好作为友元函数实现:
bool operator==(const Ftw& rhs) const { /* ... */ }
friend bool operator==(const Ftw& lhs, const Ftw& rhs) { /* ... */ }
在另一个不相关的说明中,重载一元&
几乎肯定是一个坏主意。
答案 1 :(得分:0)
编译器告诉你m_p是私有的。如果要在派生类中访问m_p,则需要将其设置为受保护或公开。
答案 2 :(得分:0)
如果您无法修改Odp
,则可以明确调用operator->()
。它返回您需要的内容,并且应该内联。
答案 3 :(得分:0)
由于Odp
在其方法中提供了免费指针(即使是地址,OMG!就像用许多锁制作门,然后将钥匙交给每个小偷),你可以做到
bool operator==(const Ftw& rhs)
{
return **this == *rhs;
}
如果Odp
实现了自己的比较运算符,您可以像这样使用它:
bool operator==(const Ftw& rhs)
{
return Odp<int>::operator==(rhs) && ... other conditions ...;
}