C++类模板特化问题

标签 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
}

最佳答案

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

这也可能会咬到你:第 3 行实际上格式不正确 - 它是 Bar 的非编译特化 - 但你不会注意到它,直到你真正尝试在 main() 函数中使用它。

关于C++类模板特化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6734224/

相关文章:

c++ - 这个自应用阶乘函数的类型是什么?

c++ - 断然阻止或阻止带有特定参数的对象实例化

magento - 如何在模板文件中加载自定义 PHP Magento block

c++ - 实现模板化模板方法

c++ - 专门针对 const 成员函数指针

c++ - 来自不同特化的模板类继承

c++ - 需要一个从 vector 派生的 vector

c++ - 有没有一种方法可以在不捕获 lambda 变量的情况下编写更短的代码?

c++ - 特定方向的二维运动

c++ - 对引用和指针的混淆