#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 ) 所述,您的帖子中提供的代码格式不正确:


结论
考虑到以上引用,我们可以得出结论,您使用的编译器有问题;它不符合标准规定的规则,不应接受该片段。

标准不允许这种构造背后的原因是什么?
老实说,这很可能归结为“好吧,允许它没有意义”。
由于 x1 的类型(以及 T 的类型)在声明类型( Foo<> => F<char> )中是已知的,因此在定义类成员时潜在的默认模板参数是无用的;它永远不会被需要,也不会被使用。

关于c++ - 隐藏在类默认模板参数后面的方法中的默认模板参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24114697/

10-12 17:11