N4296::14.7.1/1 [temp.inst]
приводится следующий пример:декларация, которая соответствует определению в шаблоне
template<class T, class U>
struct Outer {
template<class X, class Y> struct Inner;
template<class Y> struct Inner<T, Y>; // #1a
template<class Y> struct Inner<T, Y> { }; // #1b; OK: valid redeclaration of #1a
template<class Y> struct Inner<U, Y> { }; // #2
};
Outer<int, int> outer; // error at #2
и следующее объяснение дано:
Outer<int, int>::Inner<int, Y>
находится в#1b
повторно объявлен. (Это не , но определено как связанное с определением вOuter<T, U>
.)#2
также является переделкой#1a
. Он отмечен как , связанный с определением, поэтому он является недопустимым повторным описанием той же частичной специализации .
Я был смущен тем, что #1b
рассматривается как декларация, но не определение. Мы явно снабдили там тело функции и почему это еще не определение? На самом деле, вы не могли бы объяснить это выражение.
Можем ли мы определить частичную спекализацию шаблона, который мы хотим? И я до сих пор не понимаю, почему [этот код] (http://coliru.stacked-crooked.com/a/0dbfa72ad5ee9521) работает нормально. Не могли бы вы объяснить? –