C++98中,局部的类型和匿名的类型不能做模板类的实参,如
template<typename T> class X {};
template<typename T> void TempFun(T t) {};
struct A{} a;
struct {int i;}b; //b是匿名类型变量
typedef struct {int i;}B; //B是匿名类型
void fun(){
struct C{} c; //C是局部类型
X<A> x1; //C++98通过 C++11通过
X<B> x2; //C++98错误 C++11通过
X<C> x3; //C++98错误 C++11通过
TempFun(a); //C++98通过 C++11通过
TempFun(b); //C++98错误 C++11通过
TempFun(c); //C++98错误 C++11通过
}
需要注意的是,虽然匿名类型可以被模板参数接受,但是如下是不可以的
template <typename T> struct MyTemplate {};
int main(){
MyTemplate<struct {int a;}> t; //无法编译通过,匿名类型的声明不能在模板实参位置
return 0;
}