DynamicMassives.h
//------------------------------------------------------------- create simple massive
template <typename T>
T * getArray(int &len) { // returns pointer to dynamic massive
T *ptr;
if (!(ptr = new T[len])) { // conditional of possibility of memory allocation
cout << "can't allocate memory..." << endl;
return nullptr; // protection if there is no memory rest
}
else return ptr;
}
Source.cpp
#include <iostream>
#include <ctime> // for random
#include "DynamicMassives.h"
using namespace std;
int main(void) {
srand(time(NULL)); // randomize
//----------------------------------------------- Simple dynamic massive
cout << "simple dynamic massive:" << endl;
int *parr; // pointer for dynamic massive
int len = 20; // length of dynamic massive
parr = getArray(len); // call for dynamic massive creating function <<<<<<<<<<<<< ERROR!!!!
cout << endl;
system("pause");
}
Вывод:
Ошибка C2672 "getArray": не найдена соответствующая перегруженная функция
Ошибка C2783 T *getArray(int &): не удается составить аргумент шаблон для "T"
Подскажите пожалуйста, что не так с шаблоном? Без шаблона с интом везде работала отлично.
Вам нужно явно указать тип для элементов, хранящихся в массиве:
parr = getArray<int>(len);
Далее:
if (!(ptr = new T[len])) {
cout << "can't allocate memory..." << endl;
return nullptr;
}
Поведение оператора new
отлично от поведения функции malloc
- если по каким-то причинам память не может быть выделена - будет выброшено исключение. Т.о., в C Вы можете использовать подобную конструкцию, а в C++ - нет:
// OK
int* arr;
if (!(arr = (int*)malloc(...)) { ... }
// Неверно
int* arr;
if (!(arr = new int[...])) { ... }
Пример ф-ии в которой тип выводится из ее аргумента:
template<typename T>
auto sum(T _l, T _r) -> decltype(_l + _r) { return _l + _r; }
В ф-ии из Вашего примера тип не может быть выведен автоматически - т.к. в качестве аргумента Вы используете число, характеризующее число элементов в массиве, но никак не тип этих элементов.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Занимаюсь подписанием строкиОбычная подпись проходит
Пытаюсь освоить новый для себя c++ и пишу приложение "blackjack"На данный момент уже долгое время ломаю голову над этой ошибкой - Необработанное...
Собственно то почему этот код должен выбросить ошибку написано в статье: http://scrutatorme/post/2015/12/30/pointers_demystified_p2
Как динамически менять тип у вектора в структуре в зависимости от типа записываемого значения, в него могут записываться значения следующего...