• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed C++, szablonowe aliasy typów - wyjaśnienie dziwnego błędu.

Object Storage Arubacloud
0 głosów
141 wizyt
pytanie zadane 23 grudnia 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 23 grudnia 2018 przez Jakub 0

Witam, problem jest bardzo krótki i myślę że nie ma co się rozpisywać  ;)

A więc to ( fragment mojego kodu ) działa:

AST_Program_Ptr prog = std::make_unique<Composition>(
		std::make_unique<Assign>("a", std::make_unique<Constant>(10)),
		std::make_unique<Write>("a")
	);

A to już nie:


template <typename T> using TP = std::unique_ptr<T>;

// (...)

AST_Program_Ptr prog = TP<Composition>(
		TP<Assign>("a",TP<Constant>(10)),
		TP<Write>("a")
	);

mam taki komunikat błędu:
Błąd    C2440    "<function-style-cast>": nie można konwertować z "initializer list" na "std::unique_ptr<Composition,std::default_delete<_Ty>>"   

Nie zbyt rozumiem co ma tu kompilator "na myśli", przecież ja tylko zastosowałem alias zamiast pełnej nazwy...

Z góry dziękuje za pomoc.

komentarz zamknięcia: problem rozwiązany.

1 odpowiedź

+1 głos
odpowiedź 23 grudnia 2018 przez monika90 Pasjonat (22,940 p.)
wybrane 23 grudnia 2018 przez Jakub 0
 
Najlepsza
W pierwszym przypadku masz make_unique, to szablon funkcji, która tworzy obiekt i zwraca inteligentny wskaźnik.

A w drugim masz unique_ptr, nie tworzysz obiektów na które wskaźnik ma wskazywać.

TP<Write>("a") to std::unique_ptr<Write>("a"), czyli  rzutujesz tablicę znaków na inteligentny wskaźnik, to nie ma sensu.
komentarz 23 grudnia 2018 przez Jakub 0 Pasjonat (23,120 p.)
edycja 23 grudnia 2018 przez Jakub 0

frown Nie mam zielonego pojęcia jak mogłem tego nie zauważyć...

* A tak się jeszcze zapytam, da się zrobić alias na szablon funkcji? Bo umiem robić wskaźniki na funkcje, ale nie na szablonowe.

Zacząłem tak:

template <typename T> T (*M_ptr)(void);

i nie wiem co dalej, zależy mi żeby funkcje wywołać tak: M_ptr<Typ>(arg...)

a ten sposób raczej nie zadziała:

template <typename T> T(*M_ptr)(void) = std::unique_ptr<T>;

 

1
komentarz 23 grudnia 2018 przez monika90 Pasjonat (22,940 p.)

nie ma aliasów na szablony funkcji, ale da się zrobić szablon forwardujący:

template<class T, class... Args>
auto f(Args&&... args)
{
    return std::make_unique<T>(std::forward<Args>(args)...);
}

i teraz std::make_unique<T> możesz zastąpić przez f<T>

Podobne pytania

0 głosów
2 odpowiedzi 1,380 wizyt
pytanie zadane 15 maja 2017 w C i C++ przez Programeł Gaduła (3,500 p.)
0 głosów
0 odpowiedzi 97 wizyt
pytanie zadane 20 stycznia 2020 w SQL, bazy danych przez Nap0chybel Nowicjusz (120 p.)
+1 głos
1 odpowiedź 436 wizyt
pytanie zadane 22 czerwca 2017 w SQL, bazy danych przez michal.nl Nowicjusz (170 p.)

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...