Я немного новичок в функции шаблона в С++ и столкнулся с проблемой, что я не могу найти никакого результата с помощью поиска в Google.
Попытка использовать шаблон здесь для создания различных размеров массивов. Код показан ниже:
template <size_t T>
vector<array<float, T>> poissonSample(size_t T, float r) {
array<float, T> x_min, x_max;
return samples;
}
Однако определение функции выглядит нормально, когда я пытаюсь вызвать функцию с помощью чего-то вроде:
poissonSample(4, 0.3f);
Компилятор сообщит, что «ни один экземпляр шаблона функции не соответствует списку аргументов.
В чем проблема?
Вот код, который я скомпилировал на onlinegdb.com
#include <vector>
#include <array>
using namespace std;
template <size_t T>
vector<array<float, T>> poissonSample(size_t T, float r);
int main()
{
auto res = poissonSample(4, 1.0f)
return 0;
}
Вот полный текст сообщений об ошибках:
main.cpp:17:46: error: declaration of ‘size_t T’ shadows template parameter
vector<array<float, T>> poissonSample(size_t T, float r);
^
main.cpp:16:11: note: template parameter ‘T’ declared here
template <size_t T>
^~~~~~
main.cpp: In function ‘int main()’:
main.cpp:21:37: error: no matching function for call to ‘poissonSample(int, float)’
auto res = poissonSample(4, 1.0f)
^
main.cpp:17:25: note: candidate: template std::vector > poissonSample(size_t, float)
vector<array<float, T>> poissonSample(size_t T, float r);
^~~~~~~~~~~~~
main.cpp:17:25: note: template argument deduction/substitution failed:
main.cpp:21:37: note: couldn't deduce template parameter ‘T’
auto res = poissonSample(4, 1.0f)
Как видите, основная проблема заключается в том, что size_t T
в параметрах функции и size_t T
в параметрах шаблона не связаны между собой. Одна из них — конструкция времени компиляции, другая — конструкция времени выполнения.
Второстепенная проблема -
main.cpp:17:25: note: template argument deduction/substitution failed:
Компилятор не может определить ваш T.
Правильное использование будет:
template <size_t T>
vector<array<float, T>> poissonSample(float r);
int main()
{
auto res = poissonSample<4>(1.0f);
return 0;
}
(это дает только ошибку компоновщика, предоставьте свою собственную реализацию)
Ну, есть новая проблема: когда я пытаюсь использовать аргумент функции для создания этой функции possion: poissonSample<arg>(r)
, система сообщает, что «это» нельзя использовать в постоянном выражении.
Шаблоны (включая std::array) не могут использоваться таким образом. Все должно быть известно во время компиляции. Вам нужно будет изменить свой подход.
да, понимаю, что проблема в массиве. размер массива должен быть известен во время компиляции.
Спасибо за ваш ответ. Это решает мою путаницу по поводу использования шаблона для параметров, а не для типов.