Кто-нибудь знает, действительна ли эта явная специализация:
template <class>
struct L {
template <typename T>
struct O {
template <typename U>
static void Fun(U);
};
};
template<>
template<typename T>
template<typename U>
void L<int>::O<T>::Fun(U) {}
clang trunk (12/3/2013) дает следующую ошибку:
f: ... \ test.cpp: 36: 20: error: вне очереди определение Fun из класса O без определения
void L<int>::O<T>::Fun(U) {}
~~~~~~~~~~~~~~^
Произошла 1 ошибка.
Будем очень признательны за любые подтверждающие ссылки из стандарта для обоснования вашего ответа!
Примечание: я несколько удивлен, что это ошибка - я ожидал, что специализация будет выбрана для любого семейства аргументов шаблона, с которым создается экземпляр Fun, начиная с <int><?any><?any>.
Это ошибка с лязгом или ошибка в моих ожиданиях?
Спасибо!
====== РЕДАКТИРОВАТЬ (думаю, у меня есть ответ) ========
Хорошо - я думаю, что нашел подтверждающую формулировку - из N3797 (рабочий проект после Чикаго 2013) - 14.7.3 / 16 =>
"В явном объявлении специализации для члена шаблона класса или шаблона члена, который появляется в области пространства имен, шаблон члена и некоторые из включающих его шаблонов классов могут оставаться неспециализированными, за исключением того, что объявление не должно явно специализировать шаблон члена класса, если шаблоны включающих его классов также явно не специализируются ".
Если я правильно интерпретирую, нам нужна явная специализация O, если мы собираемся объявить явную специализацию его члена? Отсюда ошибка.
Верный?
Спасибо!
L<X>::O<int>
. В отличие отL<int>::O<T>
, что нормально. - person M.M   schedule 07.06.2018L<int>::O
, прежде чем эта специализация будет разрешена - person M.M   schedule 07.06.2018