То, что вы написали - это круговая логика. Подумайте об этом так.
Компилятор видит foo(3)
. foo
называет шаблон класса, поэтому он пытается выполнить вывод аргумента шаблона класса, чтобы выяснить, каким должен быть T
в foo
.
CTAD начинается с взятия всех конструкторов ипостроение шаблонов выводов из них. У вас есть один конструктор, поэтому руководство для него должно выглядеть следующим образом:
template<typename T> foo(decltype(foo<T>::x) _x) -> foo<T>;
Чтобы вывести параметр шаблона T
для foo
, вам необходимо создать экземпляр foo
.. с T
. Которого у вас еще нет , потому что выяснение, что такое T
, - это то, почему вы создали это руководство по выводам.