Итак, другие объяснили, почему ваш код не работает и как его можно улучшить.
Теперь я покажу, как вы можете все же получить следующий код для компиляции - идля правильной работы:
double* a = CreateArray(5);
int* b = CreateArray(7);
Проблема, как уже упоминалось, заключается в том, что C ++ не выводит аргументы шаблона из одних только возвращаемых типов.
Вы можете обойти это ограничение, вернув вышеуказанную функцию возвратапростой прокси-объект.Прокси-объект выполняет одну операцию: (неявное) преобразование в T*
.Вот где происходит фактическое распределение.
Поэтому функция CreateArray
очень проста (и не шаблон):
CreateArrayProxy CreateArray(std::size_t num_elements) {
return CreateArrayProxy(num_elements);
}
Что касается прокси:
struct CreateArrayProxy {
std::size_t num_elements;
CreateArrayProxy(std::size_t num_elements) : num_elements(num_elements) { }
template <typename T>
operator T*() const {
return new T[num_elements];
}
};
Easy as π.
Теперь, стоит ли использовать этот код?Нет, наверное нет.Это не дает реального преимущества перед прямым распределением.Но это полезная идиома, чтобы знать.