Во-первых, процитированный отрывок некоторого стандарта
Если на специализацию шаблона X ссылаются в контексте, который зависит от параметра-шаблона какого-либо окружающего шаблона Y, данная точка инстанции зависит от точкиинстанции Y.
Если X является специализацией шаблона функции, точка инстанцирования является точкой Y.
Если X является специализацией шаблона класса, точка инстанцирования находится непосредственно перед точкой инстанцирования Y.
В противном случае данный момент создания объекта привязывается к расположению декларации / определения области действия пространства имен (D), в котором содержится оператор, ссылающийся на X.
Если X является специализацией шаблона функции, точкаинстанцирование происходит сразу после D.
Если X является специализацией шаблона класса, точка инстанцирования находится непосредственно перед D.
Какой-то код здесь
#include <iostream>
template<int N>
struct state {
friend auto call(state<N>);
};
template<int N>
struct add_state {
friend auto call(state<N>) {
return N;
}
};
template<typename T, int N>
T show() {
add_state<N> d;
return T{};
}
template<typename T,int N>
class data {
public:
T c = show<T,N>();
};
#1,#3,#2
int main() {
data<int, 0> t;
call(state<0>{});
}
Итак, согласнок приведенным выше правилам, когда создается экземпляр класса data<int, 0>
, то точкаэкземпляра находится в # 1.
Тогда show<T,N>
зависит от параметров шаблона данных класса шаблона. Таким образом, точка создания для show<int,0>
находится на # 2.
Тогда add_state<N>
зависит от параметров шаблона функции шаблона шоу. Таким образом, в соответствии с правилами точка инстанцирования для add_state<0>
находится на # 3.
На # 3 auto call(state<0>)
определено, call(state<0>{})
должно быть связано, но на самом деле компилятор сообщает об ошибкахследующим образом:
лязг:
main.cpp:24:2: error: function 'call' with deduced return type cannot be used before it is defined
call(state<0>{});
^
main.cpp:4:14: note: 'call' declared here
friend auto call(state<N>);
^
1 error generated.
г ++:
main.cpp: In function ‘int main()’:
main.cpp:24:17: error: use of ‘auto call(state<0>)’ before deduction of ‘auto’
call(state<0>{});
^
Почему? В моем понимании о точке инстанции есть ошибки? Если нет, почему компилятор сообщает об этих ошибках?