Я пытался вызвать std :: rank для пользовательского типа Foo, это не сработало.Теперь я предполагаю, что он работает только с базовым типом, и мне нужно расширить класс Foo, чтобы использовать его.https://en.cppreference.com/w/cpp/types/rank предлагает возможную реализацию.
Я все еще изучаю C ++, и у меня нет большого опыта работы с более сложными темами.Не могли бы вы сказать мне, как я могу добавить std :: rank в Foo?
#include <iostream>
#include <type_traits>
class Foo {
};
template<class T>
struct Foo::rank : public std::integral_constant<std::size_t, 0> {};
template<class T>
struct Foo::rank<T[]> : public std::integral_constant<std::size_t, rank<T>::value + 1> {};
template<class T, std::size_t N>
struct Foo::rank<T[N]> : public std::integral_constant<std::size_t, rank<T>::value + 1> {};
int main()
{
Foo foo1[5];
Foo foo2[5][5];
std::cout << std::rank<Foo>(foo1);
std::cout << std::rank<Foo>(foo2);
}
8: 22: ошибка: полное имя не называет класс до ':' токен 8:22: ошибка: ожидается '{' before ':' токен 8:22: ошибка: ожидается неквалифицированный идентификатор до ':' токен 11:17: ошибка: 'rank' не является шаблоном класса 11:27: ошибка: квалифицированное имя не называетсякласс до маркера ':' 11:27: ошибка: ожидается '{' before ':' токен