Вопрос по автовыведению параметра шаблона класса по типам ар
От: пффф  
Дата: 18.08.24 11:20
Оценка:
Привет!

Вроде сейчас сделали такую штуку, и вроде у меня даже работало.
Но. Попробовал в другом пространстве имён сделать шаблонный 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
Отредактировано 18.08.2024 11:27 пффф . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.