Калі гэта «имяТип» ключавое слова неабходна?

<Р> <моцны> Можна стварыць дублікат:
   Афіцыйна што имяТип для?
   Дзе і чаму я павінен паставіць шаблон і TypeName ключавыя словы?

Разгледзім наступны код:

template
class C {
    struct P {};
    vector

vec; void f(); }; template void C::f() { typename vector

::iterator p = vec.begin(); }

Чаму гэта ключавое слова «имяТип» неабходна ў гэтым прыкладзе? Ці існуюць якія-небудзь іншыя выпадкі, калі павінен быць пазначаны «имяТип»?

45
дададзена аўтар Johannes Schaub - litb, крыніца

3 адказы

Кароткі адказ: Кожны раз, калі са спасылкай на укладзенае імя, якое з'яўляецца залежыць імя , то ёсць укладзенае ўнутры асобніка шаблону з невядомым параметрам.

Доўгі адказ: Ёсць тры ўзроўні аб'ектаў у C ++: каштоўнасці, тыпаў і шаблонаў. Усе тыя могуць мець імёны, і адно толькі імя не сказаць вам, якой ярус сутнасці гэта. Хутчэй за ўсё, інфармацыя пра прыроду сутнасці імя павінна быць выведзена з кантэксту.

Кожны раз, калі гэтая выснова немагчыма, Вам трэба будзе падаць яго:

template  struct Magic;//defined somewhere else

template  struct A
{
  static const int value = Magic::gnarl;//assumed "value"

  typedef typename Magic::brugh my_type;//decreed "type"
 //     ^^^^^^^^

  void foo() {
    Magic::template kwpq(1, 'a', .5);//decreed "template"
   //       ^^^^^^^^
  }
};

Here the names Magic::gnarl, Magic::brugh and Magic::kwpq had to be expliciated, because it is impossible to tell: Since Magic is a template, the very nature of the type Magic depends on T -- there may be specializations which are entirely different from the primary template, for example.

What makes Magic::gnarl a dependent name is the fact that we're inside a template definition, where T is unknown. Had we used Magic, this would be different, since the compiler knows (you promise!) the full definition of Magic.

(Калі вы хочаце, каб праверыць гэта самастойна, вось вызначэньне ўзору Чароўнае , які вы можаце выкарыстоўваць Памілаванне выкарыстанне constexpr у specializaation для сцісласці ;. Калі ў вас ёсць стары кампілятар, не саромейцеся, каб змяніць статычны член пастаяннай дэкларацыі ў старым стылі папярэдняй C ++ 11 формы).

template  struct Magic
{
  static const T                    gnarl;
  typedef T &                       brugh;
  template  static void kwpq(int, char, double) { T x; }
};
template <> struct Magic
{
 //note that `gnarl` is absent
  static constexpr long double brugh = 0.25; //`brugh` is now a value
  template  static int kwpq(int a, int b) { return a + b; }
};

выкарыстанне:

int main()
{
  A a;
  a.foo();

  return Magic::kwpq(2, 3); //no disambiguation here!
}
62
дададзена
@Nils: Const не будзе сапраўдным C ++.
дададзена аўтар Kerrek SB, крыніца
@PaoloM: Вызначэнне функцыі члена шаблону класа А павінен прааналізаваць ўжо падчас першай фазы, так што вам трэба для ліквідацыі неадназначнасці сінтаксісу, каб мець сэнс. На другім этапе, мы правяраем, што канкрэтызацыя Магія для канкрэтнага тыпу T на самой справе мае элемент kwpq , які з'яўляецца функцыяй з адпаведная подпіс. (І дзякуй за рэдагаванне!)
дададзена аўтар Kerrek SB, крыніца
Дзякуй за тлумачэнне. Але я не магу зразумець адну рэч: як імя Магія :: kwpq залежыць ад параметру шаблону T , гэтая праблема будзе вырашана ў другой фазе з двухфазнага пошуку , праўда? Дык чаму кампілятар не павінен быць у стане праверыць у той час (калі ён будзе ў стане вызначыць, ці з'яўляецца kwpq шаблон або тып або любы іншы), калі імя выкарыстоўваецца правільна ў адпаведнасці з яго < я> ярус аб'екта ?
дададзена аўтар Paolo M, крыніца

<Код> имяТипа ключавое слова, неабходна таму, што итератора гэта залежыць тып на P . Кампілятар не можа адгадаць, калі итератора ставіцца да значэння, ці тыпу, так што ўзяць на сябе значэнне, калі вы не крычыце TYPENAME . Гэта неабходна, калі ёсць тып залежыць ад аргументу шаблону, у кантэксце, альбо тыпы ці значэння будуць сапраўдныя. Так, напрыклад, у якасці базавых класаў имяТипа не патрабуецца, так як базавы клас павінен быць тыпам.

На тую ж тэму, ёсць шаблон ключавое слова, якое выкарыстоўваецца, каб кампілятар ведаў, што некаторыя залежаць імя шаблону функцыі замест значэння.

10
дададзена

ИмяТипа ключавое слова неабходна кожны раз, калі імя тыпу залежыць ад параметру шаблону, (так што кампілятар можа «ведаць» семантыка ідэнтыфікатара ( тып або значэнне ), не маючы поўная табліца сімвалаў пры першым праходзе).


Not in the same meaning, and a bit less common, the lone typename keyword can also be useful when using generic template parameters: http://ideone.com/amImX

#include 
#include 
#include 

template