例如,我需要一些包装器类,它的工作之一就是告诉我容器is_trivially_destructible是否:

template<typename T, typename = void>
class Foo {
 public:
  Foo(T *t) {
    std::cout << "a trivial" << std::endl;
  }
};

template<typename T>
class Foo<T, typename std::enable_if_t<!std::is_trivially_destructible<T>::value>> {
 public:
  Foo(T *t) {
    std::cout << "not a trivial" << std::endl;
  }
};

和两个测试类:
class Bar1 {
};

class Bar2 {
 public:
  ~Bar2() {}
};

它工作正常:
int main() {
  Bar1 bar1;
  Bar2 bar2;
  Foo<Bar1> foo1(&bar1);
  Foo<Bar2> foo2(&bar2);
}

但是如果测试类变得更加复杂:
class Bar2 {
 public:
  Bar2() : foo(nullptr) {}
  Foo<Bar2> foo;
  ~Bar2() {}
};

我收到一个错误:



我猜直到Bar2类的声明结束之前,Bar2类是不完整的,因此禁止在Bar2的声明中访问Bar2

那么这是错误的设计模式吗?如果没有,如何解决此问题?

可以重现此问题的整个程序:
#include <iostream>


template<typename T, typename = void>
class Foo {
 public:
  Foo(T *t) {
    std::cout << "a trivial" << std::endl;
  }
};

template<typename T>
class Foo<T, typename std::enable_if_t<!std::is_trivially_destructible<T>::value>> {
 public:
  Foo(T *t) {
    std::cout << "not a trivial" << std::endl;
  }
};

class Bar1 {
};

class Bar2 {
 public:
  Bar2() : foo(nullptr) {}
  Foo<Bar2> foo;
  ~Bar2() {}
};

int main() {
  Bar1 bar1;
  Bar2 bar2;
  Foo<Bar1> foo1(&bar1);
  Foo<Bar2> foo2(&bar2);
}

最佳答案

reference中明确指出,对于std::is_trivially_destructible,类型必须完整:



然后:



因此,您的程序无法编译似乎不错。

请注意,虽然可以:

class Bar2 {
 public:
  Bar2();
  ~Bar2();
  Foo<Bar2>* foo;
};

Bar2::Bar2(): foo(new Foo<Bar2>(nullptr)) {}
Bar2::~Bar2() { delete foo; }

关于c++ - is_trivially_destructible:无效使用不完整类型 ‘class Bar2’,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59317932/

10-10 16:22