删除一些但不是所有继承自 base class 的重载函数

Remove some, but not all overloaded functions inherited from base class

我正在编写一个向量 class 来获取成员指针的所有权。我想尽可能重用std:vector。我一直在尝试私有和 public 继承;在这两种情况下,我都 运行 陷入困境。

对于私有继承,请参阅问题

为了 public 继承,我需要从基础 class 中删除某些方法。具体来说,我需要防止用户在不删除对象的情况下替换成员指针。所以我想删除T* & operator[](int i)。同时,我还是要支持T* const operator[](int i) const。不知何故,前者的删除似乎否决了后者的重新实现。这是一个最小的完整示例:

#include <vector>
#include <iostream>

/* Vector class that takes ownership of member pointers */
template <class T>
class OwningVector : public std::vector<T*> {
    using super = std::vector<T*>;

public:
    ~OwningVector() { /* deletes objects pointed to */ };

    T* & operator[](int i) = delete;
    T* const operator[](int i) const { return super::operator[](i); }
};

class A {
public:
    A(int m) : m(m) {}
    int m;
};

int main() {
    OwningVector<A> v;
    v.emplace_back(new A(1));
    std::cout << v[0]->m << std::endl;
}

编译失败:

hh.cpp: In function ‘int main()’:
hh.cpp:23:21: error: use of deleted function ‘T*& OwningVector<T>::operator[](int) [with T = A]’
   23 |     std::cout << v[0]->m << std::endl;
      |                     ^
hh.cpp:9:10: note: declared here
    9 |     T* & operator[](int i) = delete;
      |          ^~~~~~~~

您正在尝试 re-invent 方向盘。您只需要一个智能指针向量:

template <class T>
using OwningVector = std::vector<std::unique_ptr<T>>;

来自评论:

如果 v 是常量,则使用 v[0]->m 将调用运算符的 const-version。否则它会调用 non-const 运算符。

您不写信给 v 并不影响这一点。