例如,我需要一些包装器类,它的工作之一就是告诉我容器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/