#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/