Różnica słów kluczowych "typename" I "class" w szablonach?
Dla szablonów widziałem obie deklaracje:
template < typename T >
template < class T >
Co za różnica?
A co dokładnie oznaczają te słowa kluczowe w poniższym przykładzie (zaczerpniętym z artykułu Niemieckiej Wikipedii o szablonach)?
template < template < typename, typename > class Container, typename Type >
class Example
{
Container< Type, std::allocator < Type > > baz;
};
6 answers
typename
i class
są wymienne w podstawowym przypadku określenia szablonu:
template<class T>
class Foo
{
};
I
template<typename T>
class Foo
{
};
Są równoważne.
Powiedziawszy to, istnieją szczególne przypadki, w których istnieje różnica między typename
i class
.
Pierwszy jest w przypadku typów zależnych. typename
jest używany do deklarowania, gdy odwołujesz się do zagnieżdżonego typu, który zależy od innego parametru szablonu, takiego jak typedef
w tym przykładzie:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
Drugi rzeczywiście pokazujesz w swoim pytaniu, choć możesz nie zdawać sobie z tego sprawy: {]}
template < template < typename, typename > class Container, typename Type >
Przy określaniu szablonu szablon szablon , class
słowo kluczowe musi być używane jak wyżej -- jest Nie wymienne z typename
w tym przypadku (uwaga: od C++17 oba słowa kluczowe są dozwolone w tym przypadku).
Musisz również użyć class
podczas jawnego tworzenia instancji szablonu:
template class Foo<int>;
Jestem pewien, że są inne przypadki, które przeoczyłem, ale najważniejsze jest to, że te dwa słowa kluczowe nie są równoważne i są to typowe przypadki, w których musisz użyć jednego lub drugiego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-26 13:28:24
Dla nazw parametrów szablonu, typename
i class
są równoważne. §14.1.2:
Nie ma różnicy semantycznej między klasą A nazwą typową w a szablon-parametr.
typename
Jednak jest to możliwe w innym kontekście przy użyciu szablonów-podpowiedzenie kompilatorowi, że odnosisz się do zależnego typu. §14.6.2:
Nazwa użyta w deklaracji wzoru lub definicji, a to zależy od zakłada się, że parametr szablonu nie Nazwa a Typ, chyba że odpowiednia nazwa lookup wyszukuje nazwę typu lub nazwę jest kwalifikowany przez słowo kluczowe typename.
Przykład:
typename some_template<T>::some_type
Bez typename
kompilator nie jest w stanie stwierdzić, czy chodzi o Typ, czy nie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-29 01:33:28
Chociaż nie ma technicznej różnicy, widziałem, że te dwa określenia oznaczają nieco inne rzeczy.
Dla szablonu, który powinien przyjmować dowolny typ jako T, łącznie z wbudowanymi (takimi jak tablica)
template<typename T>
class Foo { ... }
Dla szablonu, który będzie działał tylko tam, gdzie T jest klasą rzeczywistą.
template<class T>
class Foo { ... }
Ale pamiętaj, że jest to czysto stylowa rzecz, której niektórzy używają. Nie jest to wymagane przez standard lub egzekwowane przez kompilatory
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 22:12:23
- bez różnicy
- parametr typu szablonu {[0] } jest sam w sobie szablonem z dwoma parametrami typu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 22:03:07
Ten fragment pochodzi z C++ primer book. Chociaż jestem pewien, że to jest złe.
Każdy parametr typu musi być poprzedzony słowem kluczowym klasa lub nazwa typu:
// error: must precede U with either typename or class
template <typename T, U> T calc(const T&, const U&);
Te słowa kluczowe mają to samo znaczenie i mogą być używane zamiennie wewnątrz listy parametrów szablonu. Lista parametrów szablonu może używać obu słów kluczowych:
// ok: no distinction between typename and class in a template parameter list
template <typename T, class U> calc (const T&, const U&);
Może wydawać się bardziej intuicyjne użycie słowa kluczowego typename zamiast klasy do wyznaczenia parametru typu szablonu. W końcu możemy użyć typy wbudowane (nieklasowe) jako argument typu szablonu. Co więcej, typename wyraźniej wskazuje, że następująca nazwa jest nazwą typu. Jednak nazwa typename została dodana do C++ po tym, jak szablony były już powszechnie używane; niektórzy programiści nadal używają wyłącznie klasy
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-08 05:17:21
Nie ma różnicy między używaniem OR ; tzn. jest to konwencja używana przez programistów C++. Ja sam wolę jak to dokładniej opisuje użycie; tzn. zdefiniowanie szablonu z określonym typem:)
Uwaga: jest jeden wyjątek, w którym musisz użyć klasy (a nie nazwy typowej) podczas deklarowania parametru szablonu szablonu:
Template class C { }; / / valid!
Template class C { }; / / invalid!
W większości przypadków nie będzie definiować zagnieżdżonej definicji szablonu, więc obie definicje będą działać - po prostu bądź spójny w użyciu...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-12 17:48:58