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;
};
Author: Rakete1111, 2010-01-07

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.

 472
Author: Aaron Klotz,
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.

 105
Author: Georg Fritzsche,
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

 25
Author: Michael Anderson,
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
  1. bez różnicy
  2. parametr typu szablonu {[0] } jest sam w sobie szablonem z dwoma parametrami typu.
 9
Author: Nikolai Fetissov,
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

 6
Author: K.K,
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

Template

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...

 0
Author: Gurpreet Singh,
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