typedef шаблон со всеми аргументами по умолчанию - PullRequest
6 голосов
/ 11 июня 2011

Я объявляю шаблонный класс со всеми параметрами, имеющими аргументы по умолчанию, например:

template<typename TYPE = int>
class Foo {};

Тогда следующие два эквивалентны:

Foo<int> one;
Foo<> two;

Однако мне не разрешено просто:

Foo three;

Можно ли добиться этого с typedef с тем же именем, но без скобок, например:

typedef Foo<> Foo;

Ответы [ 6 ]

7 голосов
/ 11 июня 2011

Я делаю что-то вроде следующего, я не знаю, понравится вам это или нет:

template<typename TYPE = int>
class basic_Foo {};

typedef basic_Foo<int> Foo;
2 голосов
/ 11 июня 2011

Вы не можете переопределить символ другого типа, поэтому все, что вы сможете сделать, не будет работать, как вы ожидаете. Если вы хотите добиться этого, используйте другое имя в качестве псевдонима:

typedef Foo<> Foo_;
1 голос
/ 12 июня 2011

Если объявление typedef Foo<> Foo; разрешено, после этого имя Foo в качестве шаблона не может быть указано.То есть следующее становится недействительным.

template< template< class > class > struct A {...};
A< Foo > a; // error

Хотя вышеприведенное typedef на практике не разрешено, если вам все еще нужно записать Foo как Foo<>, макрос, подобный следующему, будетдостичь цели.

#define Foo Foo<>
1 голос
/ 11 июня 2011

Нет. Хотя вы можете объявить typedef для class с тем же именем, что и class, потому что вы можете использовать typedef, чтобы переопределить имя для ссылки на тип, к которому оно уже относится.

typedef class A A;

или если A уже объявлен как класс:

typedef A A;

Вы не можете сделать это с именем шаблона (имя шаблона не является именем класса), вам придется дать ему другое имя.

typedef Foo<> Bar;
1 голос
/ 11 июня 2011
typedef Foo<> Foo;

Дает:

prog.cpp:4: error: ‘typedef class Foo<int> Foo’ redeclared as different kind of symbol
prog.cpp:2: error: previous declaration of ‘template<class TYPE> class Foo’

Ошибка в значительной степени говорит о проблеме.Компилятор видит, что Foo повторно объявлено.

Однако это должно скомпилироваться и работать:

template<typename TYPE = int> class Foo {};

typedef Foo<> FooClone;

int main()
{
   Foo<int> one;
   Foo<> two;
   FooClone three;

   return 0;
}
0 голосов
/ 11 июня 2011

К сожалению, нет, потому что Foo уже является именем для самого шаблона класса и, следовательно, не может быть ничем другим в том же пространстве имен.

...