см. следующий код:
namespace std {
template <std::size_t I, class T>
auto& get(my_tuple_like_type<T>& t)
{
std::size_t ext = t.template extent<I>(); // This line
// .... do something with ext and return
}
}
Как видите, я пытаюсь специализировать (перегрузить) std::get
, чтобы сделать свой собственный шаблон класса my_tuple_like_type
несколько похожим на std::tuple
.
Но gcc 5.4.0 жалуется, что константа I
не является именем типа. Кажется, причина в том, что уже есть имя std::extent
, которое является шаблоном класса.
Обходной путь, который я могу придумать, - перенаправить вызов автономной функции реализации, объявленной вне namespace std
. Но мне интересно, это правильное поведение в соответствии со стандартом? Или это просто еще одна ошибка gcc?
Я предполагаю, что это должно быть ошибкой, так как clang и MSVC прекрасно компилируют приведенный выше код. С другой стороны, компилятор Nvidia CUDA (nvcc) выдает аналогичное сообщение об ошибке.
Спасибо.
ИЗМЕНИТЬ:
Предоставление перегрузок внутри namespace std
запрещено (Должны ли вы перегружать swap в пространстве имен std?), значит, я поступил неправильно.
Но я не вижу потенциальных проблем, которые это может вызвать. Есть ли причина, по которой перегрузки пользовательских типов запрещены?
std
? Для этого официально оставляет вашу программу с неопределенным поведением. Вы должны поместить свой класс в пространство имен, добавить функциюmy_namesapce::get
и позволить ADL сделать все остальное. - person StoryTeller - Unslander Monica   schedule 26.04.2017std::iterator_traits
даже предназначен для пользователей, не так ли? - person Junekey Jeon   schedule 26.04.2017std::get
при работе с определяемыми пользователем шаблонами классов, поэтому я думаю, что это должно быть разрешено ..., и я не думаю, что стандарт действительно запрещал это. - person Junekey Jeon   schedule 26.04.2017std
. Посмотрите, сможете ли вы получить нужное вам поведение с помощьюstd::tuple
вместо реализации собственного типа кортежа. Таким образом, среди прочего, вам не нужно возиться с попытками перегрузить функцию из пространства именstd
. - person Peter   schedule 26.04.2017my_tuple_like_type
в какой-либо форме или форме, или как имена в вашей реализации будут разрешаться внутри пространства имен std (именно поэтому возникает ваша ошибка, кстати). - person StoryTeller - Unslander Monica   schedule 26.04.2017extent
вt.template extent<I>
вstd::extent
... Что произойдет, если я заменюstd
на какое-то другое пространство имен, содержащее шаблонный классextent
? GCC по-прежнему считает, чтоextent
не является членомt
.... - person Junekey Jeon   schedule 26.04.2017