【发布时间】:2019-12-13 07:24:57
【问题描述】:
例如我需要一些包装类,它的工作之一是告诉我容器是否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() {}
};
我收到一个错误:
错误:不完整类型“class 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);
}
【问题讨论】:
-
您能否发布一个给出错误消息的程序,目前您有 4 个 sn-ps,尚不清楚它们是如何一起产生问题的
-
@M.M 完整程序已粘贴。
-
“我猜在 Bar2 类声明结束之前,Bar2 类是不完整的” 正确,所以你不能有成员
Foo<Bar2> foo;。 pimpl idiom 可能会有所帮助。