该项目有一系列模板函数,它们接受带有一些预期接口的参数。或多或少是这样的:
template<typename T>
void do_some(...)
{
//...
const auto c = T::some();
//...
}
template<typename T>
void do_other(...)
{
//...
const auto o = T::other();
//...
}
所以,有些特化需要T::other()
在这个地方禁止调用并显示编译错误。
第一个解决方案是简单地不声明other
所需的 specialization T
,但是编译器会抛出一个关于缺席的错误,other
并且不清楚该怎么做。我想展示一些可以理解的东西,以便清楚地表明禁止other
这样T
做,而不是忘记它。
第二种解决方案是使用static_assert
,如下所示:
int Spec::other()
{
static_assert(false, "you must not call `other` func");
}
但是,当编译器遇到定义时,总是会抛出错误Spec::other
,而不是在调用它的地方do_other
。需要时如何显示错误?
明确声明“错误”的特
other
化。= delete
明确= delete
的 - 这只是表达专业化不是“被遗忘”而是故意禁止的一种方式。如果您仍然需要显示有意义的错误消息,还有另一个技巧。它包括使它成为
Spec::other
一个模板,例如:在这种情况下,它
static_assert
会在实例化时工作Spec::other
,即在它调用的地方。即使模板参数具有默认值。