std :: auto_ptr компилируется в моем шаблонном классе, но не std :: unique_ptr

Я запустил шаблонный класс, который должен управлять декой фиксированной длины. Я искал, чтобы добавить функцию, которая будет возвращать данные, преобразованные в вектор. Поскольку я не могу быть уверен, что это будет скомпилировано с хорошим NRVO (оптимизация с возвращаемым значением) и теоретически данные могут быть достаточно большими, я решил обернуть возвращаемый результат в unique_ptr (чтобы избежать массивного вызова конструкторов копирования в конце). Как ни странно, это не скомпилировано:

 In file included from FixedDeque.cpp:8:
FixedDeque.h:26: error: ISO C++ forbids declaration of 'unique_ptr' with no type
FixedDeque.h:26: error: invalid use of '::'
FixedDeque.h:26: error: expected ';' before '<' token
FixedDeque.cpp:27: error: expected constructor, destructor, or type conversion before '<' token

Я на OS X Snow Leopard, используя g ++ в качестве компилятора в NetBeans.

Однако, когда я изменяю точно такой же код, чтобы использовать auto_ptr, все это компилируется. Есть ли проблема с unique_ptr и шаблонами? к вашему сведению, я убедился, что между смежными<‘и’> ‘в обоих случаях (чтобы избежать интерпретации символов канала).

Вот мой код, я был бы очень признателен, если бы кто-то смог пролить свет на эту проблему:

Заголовок:

#include "deque"#include "vector"#include "memory"template<typename T> class FixedDeque {
public:
FixedDeque(int size);
FixedDeque(const FixedDeque<T>& orig);
virtual ~FixedDeque();
// adding an auto_ptr/unique_ptr because not sure the C++ NRVO is applied in the compiler
std::unique_ptr< std::vector<T> > getVectorCopy() const;
private:
std::deque<T> _deq;
int _maxSize;
};#include "FixedDeque.h"template<typename T> FixedDeque<T>::FixedDeque(int size)  : _deq(size), _maxSize(size)
{ }
template<typename T> FixedDeque<T>::FixedDeque(const FixedDeque<T>& orig) : _deq(orig._deq) {}
template<typename T> FixedDeque<T>::~FixedDeque() {}
template<typename T> std::unique_ptr< std::vector<T> > FixedDeque<T>::getVectorCopy() const
{
std::vector<T>* apVector = new std::vector<T>();
return( std::unique_ptr< std::vector<T> >(apVector) );
}

Опять же, простая замена unique_ptr на auto_ptr делает все это компилируемым. Я знаю, что моя реализация возвращает указатель на пустой вектор. Я просто хотел сосредоточиться на том, что может быть не так с моим использованием unique_ptr против auto_ptr.

Спасибо!

2

Решение

Ваш код в основном правильный, за исключением того, что вы не можете скомпилировать шаблон класса. Чтобы заставить его работать, вы должны объявить и реализовать шаблон класса в файле заголовка, #include файл заголовка и создать экземпляр шаблона класса в вашей программе. Смотрите пример ниже:

// This is FixedDeque.hpp
#include <iostream>
#include <deque>
#include <vector>
#include <memory>

template<typename T> class FixedDeque {
public:
FixedDeque(int size);
FixedDeque(const FixedDeque<T>& orig);
virtual ~FixedDeque();
// adding an auto_ptr/unique_ptr because not sure the C++ NRVO is applied in the compiler
std::unique_ptr< std::vector<T> > getVectorCopy() const;
private:
std::deque<T> _deq;
int _maxSize;
};

template<typename T> FixedDeque<T>::FixedDeque(int size)  : _deq(size), _maxSize(size)
{ }
template<typename T> FixedDeque<T>::FixedDeque(const FixedDeque<T>& orig) : _deq(orig._deq) {}
template<typename T> FixedDeque<T>::~FixedDeque() {}
template<typename T> std::unique_ptr< std::vector<T> > FixedDeque<T>::getVectorCopy() const
{
std::vector<T>* apVector = new std::vector<T>();
return( std::unique_ptr< std::vector<T> >(apVector) );
}

// This is FixedDeque_Test.cpp
int main() {
FixedDeque<int> fdeque(10);
std::unique_ptr<std::vector<int>> vec = fdeque.getVectorCopy();
std::cout << vec->size() << std::endl;
return 0;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector