Привет!
Вроде сейчас сделали такую штуку, и вроде у меня даже работало.
Но. Попробовал в другом пространстве имён сделать шаблонный using — и не работает. Причем, если явно задать исходное пространство имён — то работает
Накидал пример (
godbolt):
#include <iostream>
namespace ans
{
template<typename T>
struct A
{
T t;
explicit A(T t_) : t(t_) {}
void print()
{
std::cout << "A.t: " << t << "\n";
}
};
} // namespace ans
namespace bns
{
template<typename T>
using A = ans::A<T>;
} // namespace bns
int main()
{
ans::A(3).print(); // (1) Не работает на godbolt, но у меня работает. error C2955: 'ans::A': use of class template requires template argument list
bns::A(5).print(); // (2) Не работает на godbolt, и у меня работает
return 1;
}
Тут странное происходит. У меня кода много, и я попробовал выцепить чисто данную проблему, и вот что странно — на godbolt не работают оба варианта, но у меня первый вариант работает. Не очень понимаю, что я не так выцепил.
Да, и ещё. На годболте на примере компилятор MSVC выдаёт ошибку, а у меня локально в моём коде, не в примере — всё работает в обоих случаях, хотя собираю с флагом /permissive-.
GCC на моём коде локально ругается только на второй вариант, стоит заменить его на первый — и начинает работать.
Что я делаю не так?
Как правильно называется эта фича (автовывод параметра шаблона по параметрам конструктора), и где можно почитать, как её использовать?
PS В CmakeLists.txt задан 17ый стандарт, для GCC 7.3 CMake задаёт параметр -std=c++1z