#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
,为什么会这样?
是否可以为同一个类提供多个不同的模板参数? (猜不是)但是为什么不对编译器大喊呢?
答案 0 :(得分:4)
您的帖子中提供的代码格式不正确,如C ++标准(n3337)所述:
14.1p9
模板参数[temp.param]
默认模板参数是在 template-paraemter 中
=
之后指定的 template-argument (14.3)。可以为任何类型的 template-parameter (类型,非类型,模板)指定默认的 template-argument ,它不是模板参数包(14.5.3) 。可以在模板声明中指定默认的 template-argument 。 [注意:&gt;&gt; ] template-parameter-lists中不应指定默认的 template-argument 在成员类之外出现的类模板成员的定义。 [&lt;&lt; :注意]
考虑到上面的引用,我们可以得出你正在使用的编译器有问题的结论;如果它不符合标准规定的规则,则不应接受该代码段。
老实说,这很可能归结为&#34;嗯,允许它&#34; 是没有意义的。
由于x1
的类型(以及T
的类型)在声明类型中是已知的(Foo<>
=&gt; {{ 1}}),在定义类的成员时,潜在的默认模板参数是无用的;它永远不会被要求,也不会被使用。