ベクターをラップするテンプレート化されたクラスがあります。このクラスに unique_ptrs を格納しようとしていますが、正常に動作します。ただし、void add(const T& elem)
関数を仮想としてマークすると、コンパイラ (clang) は、unique_ptr に対して「暗黙的に削除されたコピー コンストラクターへの呼び出し」を行っていることを通知します。
unique_ptrs はコピーできないことを理解しているので、void add(T&& elem)
関数を作成しました。他の追加関数を仮想としてマークするとコンパイラエラーが発生する理由がわかりません。
御時間ありがとうございます。
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
template <typename T>
class ContainerWrapper {
private:
vector<T> vec;
public:
ContainerWrapper() : vec() {
}
//Marking this as virtual causes a compiler error
void add(const T& elem) {
vec.push_back(elem);
}
void add(T&& elem) {
vec.push_back(std::move(elem));
}
T removeLast() {
T last = std::move(vec.back());
vec.pop_back();
return last;
}
};
int main() {
ContainerWrapper<unique_ptr<string>> w;
w.add(unique_ptr<string>(new string("hello")));
unique_ptr<string> s = w.removeLast();
cout << *s << endl;
}