方法中的默认模板参数隐藏在类默认模板参数后面
Default template argument in method hidden behind class default template argument
#include <iostream>
template< typename T = char >
struct Foo {
void bar();
};
template< typename T = int >
void Foo< T >::bar() {
std::cout << typeid( T ).name() << std::endl;
}
int main() {
Foo<> x1;
Foo< double > x2;
x1.bar();
x2.bar();
}
输出:char
double
char
隐藏了int
,为什么?
是否有可能对同一个类有多个不同的模板参数?(猜不是)但为什么不大喊编译器?
http://connect.microsoft.com/VisualStudio/feedback/details/892125/ill-formed-default-template-argument-not-throwing-error
格式错误的代码段
根据c++标准(n3337),你的帖子中提供的代码是错误的:
14.1p9
模板参数[temp.param]
默认模板参数是模板参数(14.3)在模板参数的
=
之后指定。默认的模板实参可以为任何类型的模板形参 (type, non-type, template)指定,只要不是模板形参包(14.5.3)。默认的模板参数可以在模板声明中指定。[注意: >>]默认的模板实参不能在类模板成员定义的模板形参列表中指定。[<<</strong>:注释]
结论
考虑到上面的引用,我们可以得出结论,你正在使用的编译器是有缺陷的;如果不符合标准中规定的规则,该代码段不应被接受。
标准不允许这种构造的原因是什么?
老实说,这很可能归结为"好吧,允许它"没有意义。
由于x1
的类型(以及T
的类型)在声明类型(Foo<>
=> F<char>
)时已知,因此在定义类的成员时,潜在的默认模板参数是无用的;它永远不会被需要,也不会被使用。
相关文章:
- 使函数参数默认为周围范围
- 如何将值传递给其参数(默认参数)
- 当“std::make_index_sequence”和“std::index_sequence”用于模板参数默认类型时
- C ,构造器中允许的参考参数默认值
- 哪些规则控制参数默认赋值?
- 错误:上一个规范后给出的参数默认参数
- 是否可以设计一个包含模板参数默认值的类
- 构造函数中参数C++默认值
- 如何设置依赖于其他参数的参数默认值
- C++模板参数默认函数实现
- QInput对话框参数默认值
- g++4.8.2上列表方法参数默认初始化时出错
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'
- 函数模板:将第一个模板参数默认为第二个
- 模板模板参数默认可以引用其他模板类型的参数
- 参数默认为先例参数的值
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- 内置类型的模板参数默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- 模板参数默认为更高版本