Использование имени шаблона вместо идентификатора шаблона внутри определения шаблона класса - PullRequest
6 голосов
/ 20 декабря 2011

Правильн ли следующий код C ++?И если да, может ли кто-нибудь указать мне пункт в стандарте, который упоминает это?Кажется, что можно использовать имя шаблона вместо идентификатора шаблона в области видимости, заключенной в шаблон, и компилятор автоматически добавляет список аргументов шаблона.

template<class Type>
class Mana {
public:
  Mana(const Mana& m) {/*...*/}
  Mana() {/*...*/}
};

вместо:

template<class Type>
class Mana {
public:
  Mana(const Mana<Type>& m) {/*...*/}
  Mana() {/*...*/}
};

Код компилируется как с g ++, так и в MS visual studio.

1 Ответ

7 голосов
/ 20 декабря 2011

Да, код правильный.(Цитата: §14.6.1 [temp.local] / 2

В рамках специализации шаблона класса или частичной специализации, когда injected-class-name являетсяиспользуется как имя-типа , эквивалентно имени-шаблона , за которым следуют аргументы-шаблона специализации шаблона класса или частичной специализации, заключенного в <>. [ Пример:

template<template<class> class T> class A { };
template<class T> class Y;
template<> class Y<int> {
   Y* p;        // meaning Y<int>
   Y<char>* q;  // meaning Y<char>
   A<Y>* a;     // meaning A<::Y>
   class B {
       template<class> friend class Y;   // meaning ::Y
   };
};

- конец примера ]

)

На самом деле этотакже используется повсеместно в стандарте, например,

// §20.4.2.1[tuple.cnstr]/10-13
tuple(const tuple& u) = default;
tuple(tuple&& u) = default;

// §21.4.6.1[string::op+=]/1-2
basic_string& operator+=(const basic_string& str);

// etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...