Я создал следующий класс шаблона
#include <concepts>
#include <stddef.h>
#include <array>
template<size_t S>
using short_vector = std::array<short, S>;
template<size_t S>
using float_vector = std::array<float, S>;
template <typename T>
concept out_type = (std::same_as<T, short> || std::same_as<T, float>);
template <typename A, typename B, typename T>
concept in_type = (std::same_as<T, A> || std::same_as<T, B>);
template <size_t Size, in_type<short_vector<Size>, float_vector<Size>> I, out_type O>
class Pebble
{
};
Как я могу создать экземпляр из Pebble
Pebble<5, short_vector<Size>, short>
но это синтаксическая ошибка
«но это синтаксическая ошибка» — «Синтаксическая ошибка» — это тип ошибки. Какова точная ошибка? Все вопросы о синтаксических ошибках должны включать полное сообщение об ошибке, скопированное в вопрос. Это одновременно помогает отвечающим людям и помогает следующему человеку, задавшему тот же вопрос, найти ваш вопрос (и ответы на него).
Всегда публикуйте полную ошибку вместе с вашим вопросом.
Во-первых, ваше in_type
определение неверно, typename T
должно быть первым параметром (подробнее о правилах замены см. этот ответ).
Во-вторых, вы не можете использовать Size
в Pebble<5, short_vector<Size>, short>
, поскольку он недоступен в этом контексте. Поэтому вы должны явно указать параметр размера для short_vector
, как в Pebble<5, short_vector<5>, short>
.
Альтернативно вы можете передать параметр шаблона шаблона, чтобы не указывать размер дважды.
Пример:
#include <concepts>
#include <stddef.h>
#include <array>
template<size_t S>
using short_vector = std::array<short, S>;
template<size_t S>
using float_vector = std::array<float, S>;
template <typename T>
concept out_type = (std::same_as<T, short> || std::same_as<T, float>);
template <typename T, typename A, typename B>
concept in_type = (std::same_as<T, A> || std::same_as<T, B>);
template <size_t Size, in_type<short_vector<Size>, float_vector<Size>> I, out_type O>
class Pebble
{
};
Pebble<5, short_vector<5>, short> a;
template <size_t Size, template<size_t S> typename I, out_type O>
requires in_type<I<Size>, short_vector<Size>, float_vector<Size>>
class Pebble2
{
};
Pebble2<5, short_vector, short> b; // pass `short_vector` as template template parameter
Size
дляPebble<5, short_vector<Size>, short>
нигде не заявлено.