如何解决typedef一个带有所有默认参数的模板
| 我声明一个模板类,其所有参数都具有默认参数,例如:template<typename TYPE = int>
class Foo {};
那么以下两个是等效的:
Foo<int> one;
Foo<> two;
但是,我不允许这样做:
Foo three;
是否可以使用具有相同名称的typedef
来实现,而无需使用方括号,如下所示:
typedef Foo<> Foo;
解决方法
如果允许声明“ 5”,则其名称
不能指定
Foo
作为模板。
即,以下变为无效。
template< template< class > class > struct A {...};
A< Foo > a; // error
虽然上述ѭ3above在实践中是不允许的,
如果您仍然需要将ѭ6编写为Foo<>
,则可以使用以下宏
会达到目的的。
#define Foo Foo<>
, 我执行以下操作,我不知道您是否喜欢:
template<typename TYPE = int>
class basic_Foo {};
typedef basic_Foo<int> Foo;
, 您无法重新声明其他类型的符号,因此您将无法执行的任何操作都无法按预期进行。
如果要实现此目的,请使用其他名称作为别名:
typedef 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’
该错误几乎可以说明问题所在。编译器认为ѭ6被重新声明了。
但是,它将编译并工作:
template<typename TYPE = int> class Foo {};
typedef Foo<> FooClone;
int main()
{
Foo<int> one;
Foo<> two;
FooClone three;
return 0;
}
, 不可以。尽管您可以为class
声明一个typedef
,并且名称与ѭ19the相同,因为您可以使用typedef重新定义一个名称,以引用它已经引用的类型。
typedef class A A;
或如果已将A
声明为一类:
typedef A A;
您不能使用模板的名称(模板的名称不是类的名称)来执行此操作,您必须给它起一个不同的名称。
typedef Foo<> Bar;
, 不幸的是,不是,因为ѭ6已经是类模板本身的名称,因此在同一命名空间中不能为其他任何东西。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。