【问题标题】:Making template function compilation fail with an error message [duplicate]使模板函数编译失败并显示错误消息[重复]
【发布时间】:2014-07-08 03:39:29
【问题描述】:

我有一些模板函数和类,它们在实例化时会因给定错误消息而导致编译失败。我之前使用过以下宏,它在 Visual Studio 和 gcc 中运行良好:

#define PFC_CTF_ERROR(msg__) {struct cterror {char msg__:0;};}

如果我有一个模板函数,我喜欢在实例化时编译失败,我会这样使用它:

template<typename T>
void foo()
{
  PFC_CTF_ERROR(you_should_never_compile_this_function);
}

但是,现在我将代码移植到 clang/llvm 并且即使未实例化该函数,它也无法编译。所以我尝试了static_assert(false, "message");,但这也失败了(现在甚至在MSVC中)。我认为的一个选项是使用依赖于模板参数的表达式,如下所示:

#define PFC_CTF_ASSERT_MSG(e__, msg__)  {struct cterror {char msg__:(e__);};}

template<typename T>
void foo()
{
  PFC_CTF_ASSERT_MSG(sizeof(T)==0, you_should_never_compile_this_function);
}

它工作正常,但使用起来很麻烦。有谁知道如何更好地做到这一点并保持旧的PFC_CTF_ERROR() 语法?

【问题讨论】:

  • ^ 那里可能有一些有用的想法?
  • @MattMcNabb 感谢您的参考。所有这些答案几乎都表明您必须使用sizeof(T)==0 技巧。我想知道是否有更好的解决方案。

标签: c++ clang static-assert


【解决方案1】:

你需要根据模板参数有一部分条件。否则,编译器不需要推迟评估它直到模板实例化。这就是sizeof(T)==0 起作用的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-01
    • 2012-11-26
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多