我声明一个模板化的类,所有参数都有默认参数,例如:
template<typename TYPE = int>
class Foo {};
然后以下两个是等价的:
Foo<int> one;
Foo<> two;
但是,我不允许这样做:
Foo three;
是否可以使用typedef
来实现相同的名称,但没有括号,如下所示:
typedef Foo<> Foo;
答案 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
已经是类模板本身的名称,因此不能是同一名称空间中的任何其他内容。