我正在撰寫一個擁有成員指標所有權的向量類。我想盡可能重用std:vector。我一直在嘗試私有和公共繼承;在這兩種情況下,我都遇到了困難。
對于私有繼承,請參閱問題如何使用私有 std::vector 基類撰寫前向迭代器。
對于公共繼承,我需要從基類中洗掉某些方法。具體來說,我需要防止用戶在不洗掉物件的情況下替換成員指標。所以我想洗掉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;
| ^~~~~~~~
uj5u.com熱心網友回復:
從評論:
如果是 const,則usingv[0]->m將呼叫運算子的 const 版本v。否則它會呼叫非常量運算子。
您不寫信的事實v不會影響這一點。
uj5u.com熱心網友回復:
您正在嘗試重新發明輪子。您只需要一個智能指標向量:
template <class T>
using OwningVector = std::vector<std::unique_ptr<T>>;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/476494.html
上一篇:如何使表格行內
下一篇:沒有預期的回傳
