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

时间:2011-06-11 15:11:31

标签: c++ templates default typedef readability

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

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

然后以下两个是等价的:

Foo<int> one;
Foo<> two;

但是,我不允许这样做:

Foo three;

是否可以使用typedef来实现相同的名称,但没有括号,如下所示:

typedef Foo<> Foo;

6 个答案:

答案 0 :(得分:7)

我做了类似下面的事情,我不知道你是否愿意:

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

typedef basic_Foo<int> Foo;

答案 1 :(得分:2)

您无法重新声明具有不同类型的符号,因此无论您能做什么都无法按预期工作。 如果要实现此目的,请使用其他名称作为别名:

typedef Foo<> Foo_;

答案 2 :(得分:1)

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;
}

答案 3 :(得分:1)

没有。虽然您可以为typedef声明与class同名的class,因为您可以使用typedef重新定义名称以引用它已引用的类型。< / p>

typedef class A A;

A已被宣布为类:

typedef A A;

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

typedef Foo<> Bar;

答案 4 :(得分:1)

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

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

虽然实际上不允许上述typedef, 如果您仍然需要将Foo写为Foo<>,请执行以下宏 将达到目的。

#define Foo Foo<>

答案 5 :(得分:0)

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