在模板类的特定实例化中使编译失败

时间:2017-12-29 16:13:48

标签: c++ class templates compiler-errors

Make C++ fail compilation on specific instantiation of template function解释了如果使用特定类实例化函数而不是如何使用类来实现编译失败。

说我有课:

template<class T>
class foo;

另一个class Bar。如果foo被实例化或专门用于Bar

,我将如何进行编译失败?

所有解决方案都像运行时一样(即使评估是在编译时,错误也只能在运行时给出,这是不合适的。)

3 个答案:

答案 0 :(得分:6)

如果在实例化foo<Bar>时需要硬编译错误,可以使用static_assert(这也允许您提供自定义错误消息):

template <class T>
class foo
{
    static_assert(!std::is_same_v<T, Bar>,
        "foo does not support Bar");
};

live example on wandbox

答案 1 :(得分:1)

放一个static_assert(false,“Class不能用xxx实例化”);在糟糕的专业化。

struct foo { };
template<typename T>
struct bar_base {
 ...
};
template<typename T>
struct foo : foo_base<T>
{ };
template<>
struct bar<foo>
{
  static_assert(false, "bar cannot be instantiated with foo");
};

这里bar_base包含所有实际的实现。

答案 2 :(得分:0)

你可以这样做:

template<class T>
class foo {};

struct bar {};

template <>
class foo<bar>;

这声明了bar的特化,但没有定义它,所以任何试图导致实例化的东西都会失败。只需确保在与foo的主要定义相同的头文件中声明此专门化,这样翻译单元就不可能看到主要定义而不是专业化。