typedef一个包含所有默认参数的模板
typedef a template with all default arguments
我声明了一个模板化的类,所有参数都有默认参数,例如:
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
已经是类模板本身的名称,因此不能是同一命名空间中的任何其他名称。
相关文章:
- 使函数参数默认为周围范围
- 如何将值传递给其参数(默认参数)
- 当“std::make_index_sequence”和“std::index_sequence”用于模板参数默认类型时
- C ,构造器中允许的参考参数默认值
- 哪些规则控制参数默认赋值?
- 错误:上一个规范后给出的参数默认参数
- 是否可以设计一个包含模板参数默认值的类
- 构造函数中参数C++默认值
- 如何设置依赖于其他参数的参数默认值
- C++模板参数默认函数实现
- QInput对话框参数默认值
- g++4.8.2上列表方法参数默认初始化时出错
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'
- 函数模板:将第一个模板参数默认为第二个
- 模板模板参数默认可以引用其他模板类型的参数
- 参数默认为先例参数的值
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- 内置类型的模板参数默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- 模板参数默认为更高版本