typedef一个包含所有默认参数的模板

typedef a template with all default arguments

本文关键字:参数 默认 包含所 一个 typedef      更新时间:2023-10-16

我声明了一个模板化的类,所有参数都有默认参数,例如:

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

那么以下两个是等价的:

Foo<int> one;
Foo<> two;

然而,我不能只做:

Foo three;

有没有可能用相同名称但没有括号的typedef来实现这一点,比如:

typedef Foo<> Foo;

我做了如下的事情,我不知道你会不会喜欢:

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

您不能用不同的类型重新声明一个符号,所以您所能做的一切都不会如您所期望的那样工作。如果你想实现这一点,请使用不同的名称作为别名:

typedef Foo<> Foo_;

如果允许声明typedef Foo<> Foo;,则名称无法将Foo指定为模板。也就是说,以下内容将无效。

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

尽管上述CCD_ 4在实践中是不允许的,如果您仍然需要将Foo写为Foo<>,则如下所示的宏将达到目的。

#define Foo Foo<>
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;
}

否。尽管您可以为与class同名的class声明typedef,因为您可以使用typedef重新定义名称以引用它已经引用的类型。

typedef class A A;

或者如果A已经声明为类:

typedef A A;

你不能用模板的名称来做这件事(模板的名称不是类的名称),你必须给它一个不同的名称。

typedef Foo<> Bar;

不幸的是,没有,因为Foo已经是类模板本身的名称,因此不能是同一命名空间中的任何其他名称。