删除一些但不是所有继承自 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
并不影响这一点。
我正在编写一个向量 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
并不影响这一点。