Использование шаблона для конструктора массива в качестве возвращаемого типа функции

Я немного новичок в функции шаблона в С++ и столкнулся с проблемой, что я не могу найти никакого результата с помощью поиска в 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);

Компилятор сообщит, что «ни один экземпляр шаблона функции не соответствует списку аргументов.

Использование шаблона для конструктора массива в качестве возвращаемого типа функции

В чем проблема?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот код, который я скомпилировал на 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;
}

(это дает только ошибку компоновщика, предоставьте свою собственную реализацию)

Спасибо за ваш ответ. Это решает мою путаницу по поводу использования шаблона для параметров, а не для типов.

X.Arthur 29.05.2019 09:39

Ну, есть новая проблема: когда я пытаюсь использовать аргумент функции для создания этой функции possion: poissonSample<arg>(r), система сообщает, что «это» нельзя использовать в постоянном выражении.

X.Arthur 29.05.2019 10:36

Шаблоны (включая std::array) не могут использоваться таким образом. Все должно быть известно во время компиляции. Вам нужно будет изменить свой подход.

user3458 29.05.2019 20:46

да, понимаю, что проблема в массиве. размер массива должен быть известен во время компиляции.

X.Arthur 29.05.2019 21:44

Другие вопросы по теме