Передача вектора в шаблонную функцию - PullRequest
2 голосов
/ 29 июля 2011

Вот небольшая функция, которую я пытаюсь написать, чтобы отслеживать динамические выделения, которые я использую в своих функциях (надоело писать delete [] все время).

template <class T>
T* snew(int size, vector<T*> list)
{
    T* pointer = new T[size];
    list.push_back(pointer);
    return pointer;
}

vector<float*> list;
float* myfloat1 = snew<float*>(HEIGHT*WIDTH,list);
float* myfloat2 = snew<float*>(HEIGHT*WIDTH,list);
float* myfloat3 = snew<float*>(HEIGHT*WIDTH,list);

Итак, когда мне нужно очистить память, я могу использовать:

template <class T>
void sdelete(vector<T*> list)
{
    vector<T*>::iterator it;
    for (it = list.begin(); it != list.end(); ++it){
        delete [] *it
        *it = NULL
    }
}

как это:

sdelete<float*>(list);

Когда я пытаюсь скомпилировать, я получаю:

cannot convert parameter 2 from 'std::vector<_Ty>' to 'std::vector<_Ty,_Ax>'

Не уверен, что это значит. Спасибо за понимание:)

Ответы [ 2 ]

6 голосов
/ 29 июля 2011

Прежде всего, вы передаете vector<T*> list по значению, что означает, что оно копируется и ваш глобальный list остается неизменным.

Сделай так:

template <class T>
T* snew(int size, vector<T*>& list)

Что касается проблемы компиляции, есть опечатка, вы применяете * слишком много раз, измените использование на

float* myfloat1 = snew<float>(HEIGHT*WIDTH,list);
sdelete<float>(list);

Или вы можете даже полагаться на вывод типа компилятора и просто написать

float* myfloat1 = snew(HEIGHT*WIDTH,list);
sdelete(list);

Но идея в целом довольно плохая, потому что, если у вас уже есть vector, вы не хотите делать new/delete вручную. Просто создайте vector<float> x(HEIGHT*WIDTH); и используйте его, он автоматически удаляется.

0 голосов
/ 29 июля 2011

Используйте

snew<float>(HEIGHT*WIDTH,list);

или лучше, просто

snew(HEIGHT*WIDTH,list);

Действительно, аргумент шаблона snew равен T, и вы передаете vector<T*>.Чтобы соответствовать vector<float*>, вы должны передать float.

При вызове шаблонов функций, однако, аргументы могут быть выведены, поэтому вам вообще не нужно ставить <float>.

Однако лучший совет, который я могу вам дать, - это забыть обо всем этом и использовать vector<vector<float>>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...