假设我有这个程序,我想要一堆专门的类型而不是一般类型。当我编译它时,我想要"Error: Int"
而不是"Error: Z"
。我试过了typeof(Z)
并且没有得到任何东西 - 这是否有标准技巧?
template<class Z>
Z derp()
{
static_assert(false, "Error: Z");
}
template <>
double derp<double>()
{
return 5;
}
int main()
{
double b = derp<double>();
int r = derp<int>();
return 0;
}
答案 0 :(得分:3)
严格来说,由于违反[temp.res]/8的静态断言,您的程序格式不正确,无需诊断。但这很容易解决。我们可以将主模板定义为已删除:
template<class Z>
Z derp() = delete;
template<>
double derp<double>()
{
return 5;
}
int main()
{
double b = derp<double>();
int r = derp<int>();
return 0;
}
现在程序运作良好,除非实际调用主要专业化。大多数编译器也会提供您想要的错误消息。这是Clang 5.0:
prog.cc:14:13: error: call to deleted function 'derp'
int r = derp<int>();
^~~~~~~~~
prog.cc:2:3: note: candidate function [with Z = int] has been explicitly deleted
Z derp() = delete;
^