C ++类模板专业化问题

时间:2011-07-18 14:10:07

标签: c++ templates specialization template-specialization

通过查看以下代码,我对第3行感到困惑 第3行不是基本模板的特例,它更像是“类重载”。但它可以成功编译 第7行中的obj1是根据第3行定义的,但未能编译 怎么样?

template<typename S,int T, void(* U)()> class Bar{};  // Base template
template<int T, void(* U)()> class Bar<double, T, U>{}; // Specialization, which is good
template<int T, void(* U)()> class Bar<double, U, T>{}; // Also good, how come?

void func(){};
int main(){
   //Bar<double, func, 1> obj1;   // Error, from line 3
}

2 个答案:

答案 0 :(得分:4)

模板很特殊:您不使用的任何内容实际上都没有实例化(编译)。这允许使用某些通用模板完成许多很酷的事情。例如,您可以定义不能使用某些类型参数进行编译的成员函数,但只要您不使用这些成员,就不会出错。

这也可以咬你:第3行实际上并不是格式良好 - 它是Bar的非编译专业化 - 但是在你的main()函数中实际尝试使用它之前你不会注意到它。

答案 1 :(得分:3)

只要该表单不在任何地方使用 - 那么编译器就不会抱怨。如果使用它,并且编译器必须实例化 - 那么它会抱怨。这就是为什么如果你取消注释,你会得到错误 - 此时,编译器会看到有缺陷的部分特化。