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

时间:2014-06-09 06:22:45

标签: c++ templates

#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

1 个答案:

答案 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}}),在定义类的成员时,潜在的默认模板参数是无用的;它永远不会被要求,也不会被使用。

相关问题