Ошибка сборки в Visual Studio 2013 с использованием `std :: unique_ptr <T>:: unique_ptr` - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь обновить исходный код, чтобы сделать его совместимым с Visual Studio 2013.

В какой-то момент у меня возникла ошибка в следующем шаблоне:

// Means of generating a key for searching STL collections of std::unique_ptr
// that avoids the side effect of deleting the pointer.
template <class T>
class FakeUniquePtr : public std::unique_ptr<T> {
 public:
  using std::unique_ptr<T>::unique_ptr;
  ~FakeUniquePtr() { std::unique_ptr<T>::release(); }
};

Я получаю следующая ошибка:

error C2886: 'unique_ptr<_Ty,std::default_delete<_Ty>>' : symbol cannot be used in a member using-declaration

Я хотел бы знать, как я могу адаптировать этот код, чтобы сделать его совместимым с Visual Studio 2013, и каков смысл этого кода. Как я могу обновить его для обеспечения совместимости кода с VS2013?

1 Ответ

1 голос
/ 26 марта 2020

Согласно этой статье в блоге Microsoft: https://devblogs.microsoft.com/cppblog/c1114-core-language-features-in-vs-2013-and-the-nov-2013-ctp/ эта функция, известная как «наследование конструкторов», недоступна в обычной версии Visual Studio 2013 (в статье упоминается сборка CTP за ноябрь 2013 года, который поддерживает это)
Без этой функции вам придется писать конструкторы, которые вызывают эквивалентные std::unique_ptr конструкторы (что сделает класс более многословным), например:

template <class T>
class FakeUniquePtr : public std::unique_ptr<T> {
 private:
  // typedef to minimize writing std::unique_ptr<T>
  typedef std::unique_ptr<T> base; 
 public:
  FakeUniquePtr() : base(){}
  // repeat for all other constructors
  ~FakeUniquePtr() { base::release(); }
};
...