这是MY_STRING类的实现。由于我希望只有一些指定的接口可见,所以我使用私有继承而不是公共接口。
class MY_STRING : private std::string
{
public:
MY_STRING() : std::string() {}
MY_STRING(const char* s) : std::string(s) {}
using std::string::operator +=;
};
int main()
{
MY_STRING s = "1", x = "2";
s += x;
}
但是我收到了一个编译错误:'std :: basic_string'是'MY_STRING'无法访问的基础。 即使我有一个丑陋的解决方案如下
const MY_STRING& operator += (const MY_STRING& s) { static_cast<std::string*>
(this)->operator+=(*static_cast<const std::string*>(&s)); return *this; }
我仍然想知道为什么会出现错误以及是否有更优雅的解决方案。
答案 0 :(得分:1)
您只能在std::string::operator+=
的成员函数中使用MY_STRING
。局外人不能使用它。你无法宣传&#34;它与using
或任何东西。
私人继承意味着什么。私有继承实际上与拥有私有成员变量相同,只是MY_STRING
的成员函数中的语法不同。
要解决此问题,您必须不使用私有继承,或为要发布的内容编写转发函数。
此外,您的转发功能似乎不必要地复杂,请尝试:
MY_STRING &operator+= (MY_STRING const &s)
{ std::string::operator+=(s); return *this; }
在非const对象上调用时,您不希望返回const引用(并且+ =对const对象没有意义)。