方法中的默认模板参数隐藏在类默认模板参数后面

Default template argument in method hidden behind class default template argument

本文关键字:参数 默认 隐藏 方法      更新时间:2023-10-16
#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>)时已知,因此在定义类的成员时,潜在的默认模板参数是无用的;它永远不会被需要,也不会被使用。